From 58937e440e6254e38b9a0e3165e7b02d21f8e44b Mon Sep 17 00:00:00 2001 From: alexandredevely <12896316+alexandredevely@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:10:59 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20abcdeskt?= =?UTF-8?q?opio/docs@b76d7f7271b1a3d9820bbcdce1da67b89761b791=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.0/config/authentification-rules/index.html | 106 + 1.0/config/authentification/index.html | 106 + .../authexplicit-activedirectory/index.html | 106 + 1.0/config/authexplicit-ldap/index.html | 106 + 1.0/config/authexplicit/index.html | 106 + 1.0/config/authexternal/index.html | 106 + 1.0/config/authimplicit/index.html | 106 + 1.0/config/balloon/index.html | 106 + 1.0/config/controllers/index.html | 106 + 1.0/config/controllers/manager/index.html | 106 + 1.0/config/editconfig/index.html | 106 + 1.0/config/frontjs/index.html | 106 + 1.0/config/host_config/index.html | 106 + 1.0/config/jira/index.html | 106 + 1.0/config/language/index.html | 106 + 1.0/config/linux_syslog_config/index.html | 106 + 1.0/config/logging/index.html | 106 + 1.0/config/stack/index.html | 106 + 1.0/config/syslog/index.html | 106 + 1.0/config/webrtc/index.html | 106 + 1.0/features/index.html | 106 + 1.0/setup/k8smacosinstallation/index.html | 106 + 1.0/setup/k8swindows10installation/index.html | 106 + 1.0/setup/kubernetes_secure_etcd/index.html | 106 + 1.0/setup/novnc/index.html | 106 + 1.0/setup/retrieve_all_images/index.html | 106 + 1.0/setup/uninstalldockermode/index.html | 106 + 1.0/setup/vnc/index.html | 106 + 2.0/config/authentification-rules/index.html | 106 + .../authexplicit-activedirectory/index.html | 106 + 2.0/config/authexplicit-ldap/index.html | 106 + 2.0/config/authexplicit/index.html | 106 + 2.0/config/authexternal/index.html | 106 + 2.0/config/authimplicit/index.html | 106 + 2.0/config/authmetaexplicit/index.html | 106 + 2.0/config/balloon/index.html | 106 + 2.0/config/controllers/index.html | 106 + 2.0/config/controllers/manager/index.html | 106 + 2.0/config/desktop/index.html | 106 + 2.0/config/editconfig/index.html | 106 + 2.0/config/frontjs/index.html | 106 + 2.0/config/host_config/index.html | 106 + 2.0/config/jira/index.html | 106 + 2.0/config/language/index.html | 106 + 2.0/config/linux_syslog_config/index.html | 106 + 2.0/config/logging/index.html | 106 + 2.0/config/stack/index.html | 106 + 2.0/config/syslog/index.html | 106 + 2.0/config/webrtc/index.html | 106 + 2.0/features/index.html | 106 + .../index.html | 106 + .../createsampleapplication/index.html | 106 + 3.0/config/applications/index.html | 106 + 3.0/config/authentification-rules/index.html | 106 + 3.0/config/authentification/index.html | 106 + .../authexplicit-activedirectory/index.html | 106 + 3.0/config/authexplicit-ldap/index.html | 106 + 3.0/config/authexplicit/index.html | 106 + 3.0/config/authexternal/index.html | 106 + 3.0/config/authimplicit/index.html | 106 + 3.0/config/authmetaexplicit/index.html | 106 + 3.0/config/balloon/index.html | 106 + .../cloudprovider.loadbalancing/index.html | 106 + 3.0/config/controllers/index.html | 106 + 3.0/config/controllers/manager/index.html | 106 + 3.0/config/desktop.pod/index.html | 106 + 3.0/config/desktop/index.html | 106 + 3.0/config/editconfig/index.html | 106 + 3.0/config/frontjs/index.html | 106 + 3.0/config/host_config/index.html | 106 + 3.0/config/jira/index.html | 106 + 3.0/config/language/index.html | 106 + 3.0/config/linux_syslog_config/index.html | 106 + 3.0/config/logging/index.html | 106 + 3.0/config/networkpolicy/index.html | 106 + 3.0/config/stack/index.html | 106 + 3.0/config/sudo-kubernetes/index.html | 106 + 3.0/config/syslog/index.html | 106 + 3.0/config/volumes/index.html | 106 + 3.0/config/webrtc/index.html | 106 + 3.0/features/index.html | 106 + 3.0/setup/k8slinuxinstallation/index.html | 106 + 3.0/setup/kubernetes_abcdesktop/index.html | 106 + .../index.html | 106 + 3.0/setup/kubernetesmode/index.html | 106 + 3.0/setup/requirements/index.html | 106 + .../troubleshooting_core_services/index.html | 106 + 3.0/setup/uninstall_kubernetes/index.html | 106 + 3.1/config/persistentvolumes/index.html | 106 + 3.1/setup/k8slinuxinstallation/index.html | 106 + 3.1/setup/kubernetes_abcdesktop/index.html | 106 + .../index.html | 106 + .../troubleshooting_core_services/index.html | 106 + 3.1/setup/uninstall_kubernetes/index.html | 106 + 3.2/config/persistentvolumes/index.html | 106 + 3.2/config/webrtc/index.html | 106 + 3.2/setup/k8slinuxinstallation/index.html | 106 + 3.2/setup/kubernetes_abcdesktop/index.html | 106 + .../index.html | 106 + .../kubernetes_abcdesktop_windows/index.html | 106 + 3.2/setup/uninstall_kubernetes/index.html | 106 + .../uninstall_kubernetes_windows/index.html | 106 + 3.3/config/networkpolicy/index.html | 106 + 3.3/setup/kubernetes_abcdesktop/index.html | 106 + .../index.html | 106 + .../kubernetes_abcdesktop_windows/index.html | 106 + 3.3/setup/uninstall_kubernetes/index.html | 106 + .../uninstall_kubernetes_windows/index.html | 106 + 3.4/setup/kubernetes_abcdesktop/index.html | 106 + .../index.html | 106 + .../kubernetes_abcdesktop_windows/index.html | 106 + 3.4/setup/uninstall_kubernetes/index.html | 108 +- .../uninstall_kubernetes_windows/index.html | 106 + 3.5/setup/img/add-env-variable.PNG | Bin 0 -> 23123 bytes 3.5/setup/img/checking-kubernetes-start.PNG | Bin 0 -> 86280 bytes .../checking-openssl-correctly-installed.PNG | Bin 0 -> 7560 bytes 3.5/setup/img/dl-docker-desktop.PNG | Bin 0 -> 251762 bytes 3.5/setup/img/dl-openssl.PNG | Bin 0 -> 165991 bytes 3.5/setup/img/enable-kubernetes.PNG | Bin 0 -> 74307 bytes 3.5/setup/img/follow-install-step1.PNG | Bin 0 -> 36055 bytes 3.5/setup/img/follow-install-step2.PNG | Bin 0 -> 24379 bytes 3.5/setup/img/goto-edit-env-variable.PNG | Bin 0 -> 17239 bytes .../kubernetes-setup-login-anonymous-3.1.png | Bin 0 -> 66708 bytes ...ernetes-setup-login-anonymous.done-3.1.png | Bin 0 -> 20025 bytes ...etes-setup-login-anonymous.pending-3.1.png | Bin 0 -> 39162 bytes .../img/kubernetesaddapplication-2048.png | Bin 0 -> 439787 bytes 3.5/setup/img/kubernetesaddapplications.png | Bin 0 -> 480972 bytes 3.5/setup/img/search-docker-desktop.PNG | Bin 0 -> 111770 bytes 3.5/setup/img/search-openssl.PNG | Bin 0 -> 148442 bytes 3.5/setup/img/starting-docker-desktop.PNG | Bin 0 -> 29110 bytes 3.5/setup/img/system-variables.PNG | Bin 0 -> 17402 bytes 3.5/setup/kubernetes_abcdesktop/index.html | 4614 +++++++++++++++++ .../index.html | 4300 +++++++++++++++ .../kubernetes_abcdesktop_windows/index.html | 4213 +++++++++++++++ 3.5/setup/uninstall_kubernetes/index.html | 4129 +++++++++++++++ .../uninstall_kubernetes_windows/index.html | 4044 +++++++++++++++ 404.html | 106 + about/authors/index.html | 106 + about/gnu-gpl-v2.0/index.html | 106 + about/howreadthisdoc/index.html | 106 + about/howtodolabsexercices/index.html | 106 + about/opensource/index.html | 106 + about/otherrelatedprojects/index.html | 106 + about/play_sound_in_docker/index.html | 106 + about/version/index.html | 106 + adopters/index.html | 106 + api/backend/launchdesktop/index.html | 106 + applications/2048-alpine-error/index.html | 106 + applications/2048-alpine/index.html | 106 + applications/2048-ubuntu/index.html | 106 + applications/2048/index.html | 106 + .../oc.template.alpine.3.17/index.html | 106 + .../oc.template.alpine.3.18/index.html | 106 + .../index.html | 106 + .../oc.template.alpine.edge.gtk/index.html | 106 + .../oc.template.alpine.edge/index.html | 106 + .../oc.template.alpine.gtk/index.html | 106 + .../oc.template.alpine.libreoffice/index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../oc.template.alpine.minimal/index.html | 106 + .../oc.template.alpine.wine/index.html | 106 + .../oc.template.alpine/index.html | 106 + .../oc.template.debian.gtk/index.html | 106 + .../oc.template.debian.minimal/index.html | 106 + .../oc.template.debian/index.html | 106 + .../oc.template.rockylinux.8/index.html | 106 + .../oc.template.rockylinux.9/index.html | 106 + .../oc.template.rockylinux.gtk.8/index.html | 106 + .../oc.template.rockylinux.gtk.9/index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../oc.template.ubuntu.18.04/index.html | 106 + .../oc.template.ubuntu.20.04/index.html | 106 + .../oc.template.ubuntu.22.04/index.html | 106 + .../oc.template.ubuntu.24.04/index.html | 106 + .../oc.template.ubuntu.gtk.18.04/index.html | 106 + .../oc.template.ubuntu.gtk.20.04/index.html | 106 + .../oc.template.ubuntu.gtk.22.04/index.html | 106 + .../oc.template.ubuntu.gtk.24.04/index.html | 106 + .../oc.template.ubuntu.gtk.java/index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../oc.template.ubuntu.gtk/index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../index.html | 106 + .../oc.template.ubuntu.wine/index.html | 106 + applications/apachedirectorystudio/index.html | 106 + applications/astromenace/index.html | 106 + applications/atom/index.html | 106 + applications/base/index.html | 106 + applications/beekeeperstudio/index.html | 106 + applications/blender/index.html | 106 + applications/bless/index.html | 106 + applications/blobby/index.html | 106 + applications/boxes/index.html | 106 + applications/brackets/index.html | 106 + applications/calc/index.html | 106 + applications/calculator/index.html | 106 + applications/chess/index.html | 106 + applications/chrome/index.html | 106 + applications/chromium/index.html | 106 + applications/citrix/index.html | 106 + applications/cloudfoundry/index.html | 106 + applications/cmd.exe/index.html | 106 + applications/cntlm/index.html | 106 + applications/corsix-th/index.html | 106 + applications/cuda/index.html | 106 + applications/cudademo/index.html | 106 + applications/cudadev/index.html | 106 + applications/dia/index.html | 106 + applications/doom/index.html | 106 + applications/draw/index.html | 106 + applications/drawio/index.html | 106 + applications/dummy/index.html | 106 + applications/eclipse/index.html | 106 + applications/eclipse_sts4/index.html | 106 + applications/edge/index.html | 106 + applications/elementary.terminal/index.html | 106 + applications/eog/index.html | 106 + applications/evince/index.html | 106 + applications/evolution/index.html | 106 + applications/file-roller/index.html | 106 + applications/filelight/index.html | 106 + applications/filezilla/index.html | 106 + applications/firefox-esr/index.html | 106 + applications/firefox/index.html | 106 + applications/firefoxrest/index.html | 106 + applications/flare/index.html | 106 + applications/frozen-bubble/index.html | 106 + applications/gcompris/index.html | 106 + applications/geany/index.html | 106 + applications/gedit/index.html | 106 + applications/gelemental/index.html | 106 + applications/geogebra/index.html | 106 + applications/gephi/index.html | 106 + applications/gimagereader/index.html | 106 + applications/gimp/index.html | 106 + applications/gnumeric/index.html | 106 + applications/golly/index.html | 106 + applications/gretl/index.html | 106 + applications/hyper/index.html | 106 + applications/impress/index.html | 106 + applications/index.html | 106 + applications/inkscape/index.html | 106 + applications/jupyter/index.html | 106 + applications/jupyternvidia/index.html | 106 + applications/kalzium/index.html | 106 + applications/kdiamond/index.html | 106 + applications/kgeography/index.html | 106 + applications/kigo/index.html | 106 + applications/klickety/index.html | 106 + applications/klotski/index.html | 106 + applications/konsole/index.html | 106 + applications/ksquares/index.html | 106 + applications/kturtle/index.html | 106 + applications/leocad/index.html | 106 + applications/librecad/index.html | 106 + applications/list/index.html | 108 +- applications/mahjongg/index.html | 106 + applications/maps/index.html | 106 + applications/math/index.html | 106 + applications/mathwar/index.html | 106 + applications/minecraft/index.html | 106 + applications/mines/index.html | 106 + applications/nautilus/index.html | 106 + applications/netbeans/index.html | 106 + applications/notepad-wine/index.html | 106 + applications/notepadqq/index.html | 106 + applications/octave/index.html | 106 + applications/onlyoffice/index.html | 106 + applications/openshift/index.html | 106 + applications/pinta/index.html | 106 + applications/planner/index.html | 106 + applications/postman/index.html | 106 + applications/powershell/index.html | 106 + applications/putty-unix/index.html | 106 + applications/putty-wine/index.html | 106 + applications/qelectrotech/index.html | 106 + applications/remarkable/index.html | 106 + applications/remmina/index.html | 106 + applications/remotedesktopmanager/index.html | 106 + applications/rhythmbox/index.html | 106 + applications/robots/index.html | 106 + applications/shotcut/index.html | 106 + applications/stellarium/index.html | 106 + applications/step/index.html | 106 + applications/stress/index.html | 106 + applications/sublime-text/index.html | 106 + applications/sudoku/index.html | 106 + applications/supertux2/index.html | 106 + applications/swell-foop/index.html | 106 + applications/taquin/index.html | 106 + applications/teams/index.html | 106 + applications/terminal/index.html | 106 + applications/terminalai/index.html | 106 + applications/terminalephemeral/index.html | 106 + applications/terminalpod/index.html | 106 + applications/tetravex/index.html | 106 + applications/thunderbird/index.html | 106 + applications/vice/index.html | 106 + applications/vlc/index.html | 106 + applications/vmmacos/index.html | 106 + applications/vmrc/index.html | 106 + applications/vmubuntu/index.html | 106 + applications/vscode/index.html | 106 + applications/weather/index.html | 106 + applications/whatsdesk/index.html | 106 + applications/winefile-wine/index.html | 106 + applications/winemine-wine/index.html | 106 + applications/winhelp-wine/index.html | 106 + applications/winscp-wine/index.html | 106 + applications/wireshark/index.html | 106 + applications/writer/index.html | 106 + applications/xclock/index.html | 106 + applications/xedit/index.html | 106 + applications/xeyes/index.html | 106 + applications/xman/index.html | 106 + applications/xpad/index.html | 106 + applications/xterm/index.html | 106 + applications/youtube/index.html | 106 + applicationsformat/index.html | 106 + architecture/index.html | 106 + buildapplications.wine/index.html | 106 + buildapplicationsgnulinux/index.html | 106 + changelog/index.html | 106 + cheatsheets/bash/index.html | 106 + cheatsheets/docker/index.html | 106 + cheatsheets/macos/index.html | 106 + common/1.0/abcdesktop.bastion/index.html | 106 + common/1.0/docker_macvlan/index.html | 106 + common/1.0/update_frontend_image/index.html | 106 + .../index.html | 106 + common/3.0/mount_nfs_tag/index.html | 106 + common/3.0/multiplegroupsfeature/index.html | 106 + common/3.0/update_frontend_image/index.html | 106 + common/3.3/update_frontend_image/index.html | 106 + common/acl/index.html | 106 + common/custom-wallpaper/index.html | 106 + common/debug_application/index.html | 106 + common/disable-firefox-connections/index.html | 106 + .../index.html | 106 + common/firefox-extension/index.html | 106 + common/flash-firefox-esr/index.html | 106 + common/non-free-applications/index.html | 106 + common/shm/index.html | 106 + common/upload_and_download_files/index.html | 106 + core/memcached/index.html | 106 + core/mongodb/index.html | 106 + core/nginx/index.html | 106 + core/ocuser/index.html | 106 + core/pyos/index.html | 106 + core/speedtest/index.html | 106 + faq/index.html | 106 + guiappsoddocker/index.html | 106 + index.html | 106 + overview/index.html | 106 + rdgp/index.html | 106 + requirements/index.html | 106 + runapplications.wine/index.html | 106 + search/search_index.json | 2 +- services/file-service/index.html | 106 + services/spawner-service/index.html | 106 + setup/kubernetes_flexvolume/index.html | 106 + setup/kubernetes_networkpolicies/index.html | 106 + sitemap.xml | 722 +-- sitemap.xml.gz | Bin 2477 -> 2501 bytes 378 files changed, 58986 insertions(+), 354 deletions(-) create mode 100644 3.5/setup/img/add-env-variable.PNG create mode 100644 3.5/setup/img/checking-kubernetes-start.PNG create mode 100644 3.5/setup/img/checking-openssl-correctly-installed.PNG create mode 100644 3.5/setup/img/dl-docker-desktop.PNG create mode 100644 3.5/setup/img/dl-openssl.PNG create mode 100644 3.5/setup/img/enable-kubernetes.PNG create mode 100644 3.5/setup/img/follow-install-step1.PNG create mode 100644 3.5/setup/img/follow-install-step2.PNG create mode 100644 3.5/setup/img/goto-edit-env-variable.PNG create mode 100644 3.5/setup/img/kubernetes-setup-login-anonymous-3.1.png create mode 100644 3.5/setup/img/kubernetes-setup-login-anonymous.done-3.1.png create mode 100644 3.5/setup/img/kubernetes-setup-login-anonymous.pending-3.1.png create mode 100644 3.5/setup/img/kubernetesaddapplication-2048.png create mode 100644 3.5/setup/img/kubernetesaddapplications.png create mode 100644 3.5/setup/img/search-docker-desktop.PNG create mode 100644 3.5/setup/img/search-openssl.PNG create mode 100644 3.5/setup/img/starting-docker-desktop.PNG create mode 100644 3.5/setup/img/system-variables.PNG create mode 100644 3.5/setup/kubernetes_abcdesktop/index.html create mode 100644 3.5/setup/kubernetes_abcdesktop_applications/index.html create mode 100644 3.5/setup/kubernetes_abcdesktop_windows/index.html create mode 100644 3.5/setup/uninstall_kubernetes/index.html create mode 100644 3.5/setup/uninstall_kubernetes_windows/index.html diff --git a/1.0/config/authentification-rules/index.html b/1.0/config/authentification-rules/index.html index 84aaa1db2..0cd078916 100644 --- a/1.0/config/authentification-rules/index.html +++ b/1.0/config/authentification-rules/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authentification/index.html b/1.0/config/authentification/index.html index 556deffde..5f5e6cb81 100644 --- a/1.0/config/authentification/index.html +++ b/1.0/config/authentification/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authexplicit-activedirectory/index.html b/1.0/config/authexplicit-activedirectory/index.html index e5424d5cf..c42acb732 100644 --- a/1.0/config/authexplicit-activedirectory/index.html +++ b/1.0/config/authexplicit-activedirectory/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authexplicit-ldap/index.html b/1.0/config/authexplicit-ldap/index.html index 2cfc69c6e..0678bf126 100644 --- a/1.0/config/authexplicit-ldap/index.html +++ b/1.0/config/authexplicit-ldap/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authexplicit/index.html b/1.0/config/authexplicit/index.html index 02c1f5ccd..dc7274601 100644 --- a/1.0/config/authexplicit/index.html +++ b/1.0/config/authexplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authexternal/index.html b/1.0/config/authexternal/index.html index 56cf72d7b..3a2fd4a1c 100644 --- a/1.0/config/authexternal/index.html +++ b/1.0/config/authexternal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/authimplicit/index.html b/1.0/config/authimplicit/index.html index d1013cede..f761adc37 100644 --- a/1.0/config/authimplicit/index.html +++ b/1.0/config/authimplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/balloon/index.html b/1.0/config/balloon/index.html index 1fdf5f315..831aa2991 100644 --- a/1.0/config/balloon/index.html +++ b/1.0/config/balloon/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/controllers/index.html b/1.0/config/controllers/index.html index 0dce1d6a5..8ec1ee23c 100644 --- a/1.0/config/controllers/index.html +++ b/1.0/config/controllers/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/controllers/manager/index.html b/1.0/config/controllers/manager/index.html index edb100c25..fca340bd0 100644 --- a/1.0/config/controllers/manager/index.html +++ b/1.0/config/controllers/manager/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/editconfig/index.html b/1.0/config/editconfig/index.html index c0ef301a8..1301a68f2 100644 --- a/1.0/config/editconfig/index.html +++ b/1.0/config/editconfig/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/frontjs/index.html b/1.0/config/frontjs/index.html index 7410afd6d..1973c162c 100644 --- a/1.0/config/frontjs/index.html +++ b/1.0/config/frontjs/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/host_config/index.html b/1.0/config/host_config/index.html index 7c68ac6bf..3f30f9b15 100644 --- a/1.0/config/host_config/index.html +++ b/1.0/config/host_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/jira/index.html b/1.0/config/jira/index.html index 26bd7587e..10ee5a448 100644 --- a/1.0/config/jira/index.html +++ b/1.0/config/jira/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/language/index.html b/1.0/config/language/index.html index 3bbefcac1..7df4c6d0f 100644 --- a/1.0/config/language/index.html +++ b/1.0/config/language/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/linux_syslog_config/index.html b/1.0/config/linux_syslog_config/index.html index 2c7ee427f..157ca4c45 100644 --- a/1.0/config/linux_syslog_config/index.html +++ b/1.0/config/linux_syslog_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/logging/index.html b/1.0/config/logging/index.html index 71bb5ac87..f2239927c 100644 --- a/1.0/config/logging/index.html +++ b/1.0/config/logging/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/stack/index.html b/1.0/config/stack/index.html index 289f85dd3..89845e8e5 100644 --- a/1.0/config/stack/index.html +++ b/1.0/config/stack/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/syslog/index.html b/1.0/config/syslog/index.html index d96f04db6..2e94f7b2d 100644 --- a/1.0/config/syslog/index.html +++ b/1.0/config/syslog/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/config/webrtc/index.html b/1.0/config/webrtc/index.html index f4ed939df..d9faf552c 100644 --- a/1.0/config/webrtc/index.html +++ b/1.0/config/webrtc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/features/index.html b/1.0/features/index.html index c81f7a584..06bf7ae1a 100644 --- a/1.0/features/index.html +++ b/1.0/features/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/k8smacosinstallation/index.html b/1.0/setup/k8smacosinstallation/index.html index c58c4550d..e474a87f6 100644 --- a/1.0/setup/k8smacosinstallation/index.html +++ b/1.0/setup/k8smacosinstallation/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/k8swindows10installation/index.html b/1.0/setup/k8swindows10installation/index.html index a5614ccec..4c172ed72 100644 --- a/1.0/setup/k8swindows10installation/index.html +++ b/1.0/setup/k8swindows10installation/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/kubernetes_secure_etcd/index.html b/1.0/setup/kubernetes_secure_etcd/index.html index 6671cef4a..1f4382404 100644 --- a/1.0/setup/kubernetes_secure_etcd/index.html +++ b/1.0/setup/kubernetes_secure_etcd/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/novnc/index.html b/1.0/setup/novnc/index.html index 01e1a541c..e3c5c37a9 100644 --- a/1.0/setup/novnc/index.html +++ b/1.0/setup/novnc/index.html @@ -1900,6 +1900,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/retrieve_all_images/index.html b/1.0/setup/retrieve_all_images/index.html index b5ece22d7..5acce45c5 100644 --- a/1.0/setup/retrieve_all_images/index.html +++ b/1.0/setup/retrieve_all_images/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/uninstalldockermode/index.html b/1.0/setup/uninstalldockermode/index.html index e3fc31e33..d7422835d 100644 --- a/1.0/setup/uninstalldockermode/index.html +++ b/1.0/setup/uninstalldockermode/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/1.0/setup/vnc/index.html b/1.0/setup/vnc/index.html index f4ab94b51..7609196ba 100644 --- a/1.0/setup/vnc/index.html +++ b/1.0/setup/vnc/index.html @@ -1858,6 +1858,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authentification-rules/index.html b/2.0/config/authentification-rules/index.html index 5551d6df2..65934eafe 100644 --- a/2.0/config/authentification-rules/index.html +++ b/2.0/config/authentification-rules/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authexplicit-activedirectory/index.html b/2.0/config/authexplicit-activedirectory/index.html index a1a8b8b59..495736db1 100644 --- a/2.0/config/authexplicit-activedirectory/index.html +++ b/2.0/config/authexplicit-activedirectory/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authexplicit-ldap/index.html b/2.0/config/authexplicit-ldap/index.html index 38feaeb16..8696012b2 100644 --- a/2.0/config/authexplicit-ldap/index.html +++ b/2.0/config/authexplicit-ldap/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authexplicit/index.html b/2.0/config/authexplicit/index.html index c2c5822c8..f0b5bccd3 100644 --- a/2.0/config/authexplicit/index.html +++ b/2.0/config/authexplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authexternal/index.html b/2.0/config/authexternal/index.html index e8aa7e856..5347c6574 100644 --- a/2.0/config/authexternal/index.html +++ b/2.0/config/authexternal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authimplicit/index.html b/2.0/config/authimplicit/index.html index 40acc8f8a..8398781ea 100644 --- a/2.0/config/authimplicit/index.html +++ b/2.0/config/authimplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/authmetaexplicit/index.html b/2.0/config/authmetaexplicit/index.html index ba948fb84..86516e57b 100644 --- a/2.0/config/authmetaexplicit/index.html +++ b/2.0/config/authmetaexplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/balloon/index.html b/2.0/config/balloon/index.html index 3faf3e2b4..25ad81d43 100644 --- a/2.0/config/balloon/index.html +++ b/2.0/config/balloon/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/controllers/index.html b/2.0/config/controllers/index.html index ae28e3875..50d533f93 100644 --- a/2.0/config/controllers/index.html +++ b/2.0/config/controllers/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/controllers/manager/index.html b/2.0/config/controllers/manager/index.html index 868f77dec..38d14085c 100644 --- a/2.0/config/controllers/manager/index.html +++ b/2.0/config/controllers/manager/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/desktop/index.html b/2.0/config/desktop/index.html index 9b1630347..420d08c15 100644 --- a/2.0/config/desktop/index.html +++ b/2.0/config/desktop/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/editconfig/index.html b/2.0/config/editconfig/index.html index e67768176..2d6bebbe1 100644 --- a/2.0/config/editconfig/index.html +++ b/2.0/config/editconfig/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/frontjs/index.html b/2.0/config/frontjs/index.html index 8b6e54be5..85ec66d6a 100644 --- a/2.0/config/frontjs/index.html +++ b/2.0/config/frontjs/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/host_config/index.html b/2.0/config/host_config/index.html index ae13ded5d..da6b127c3 100644 --- a/2.0/config/host_config/index.html +++ b/2.0/config/host_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/jira/index.html b/2.0/config/jira/index.html index 563b0048c..57b2e5a76 100644 --- a/2.0/config/jira/index.html +++ b/2.0/config/jira/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/language/index.html b/2.0/config/language/index.html index 5a92b95fe..e47c8f112 100644 --- a/2.0/config/language/index.html +++ b/2.0/config/language/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/linux_syslog_config/index.html b/2.0/config/linux_syslog_config/index.html index 3eed415cd..be254b978 100644 --- a/2.0/config/linux_syslog_config/index.html +++ b/2.0/config/linux_syslog_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/logging/index.html b/2.0/config/logging/index.html index c6b4ce8f5..91431533d 100644 --- a/2.0/config/logging/index.html +++ b/2.0/config/logging/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/stack/index.html b/2.0/config/stack/index.html index 55428cfee..21412bd87 100644 --- a/2.0/config/stack/index.html +++ b/2.0/config/stack/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/syslog/index.html b/2.0/config/syslog/index.html index 0f0d05db4..54d4616d8 100644 --- a/2.0/config/syslog/index.html +++ b/2.0/config/syslog/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/config/webrtc/index.html b/2.0/config/webrtc/index.html index d00415b78..f4a6590c0 100644 --- a/2.0/config/webrtc/index.html +++ b/2.0/config/webrtc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/2.0/features/index.html b/2.0/features/index.html index 52bc4ba10..f5fba8218 100644 --- a/2.0/features/index.html +++ b/2.0/features/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/application/applicationruntime_ephemeralcontainer_pod/index.html b/3.0/application/applicationruntime_ephemeralcontainer_pod/index.html index 398b88ee9..8bb02f159 100644 --- a/3.0/application/applicationruntime_ephemeralcontainer_pod/index.html +++ b/3.0/application/applicationruntime_ephemeralcontainer_pod/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/application/createsampleapplication/index.html b/3.0/application/createsampleapplication/index.html index 1af6d778a..42a63c334 100644 --- a/3.0/application/createsampleapplication/index.html +++ b/3.0/application/createsampleapplication/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/applications/index.html b/3.0/config/applications/index.html index 7ee17189e..a0561185a 100644 --- a/3.0/config/applications/index.html +++ b/3.0/config/applications/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authentification-rules/index.html b/3.0/config/authentification-rules/index.html index abbb40bdb..4217793b1 100644 --- a/3.0/config/authentification-rules/index.html +++ b/3.0/config/authentification-rules/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authentification/index.html b/3.0/config/authentification/index.html index 8c1935adf..ef288979b 100644 --- a/3.0/config/authentification/index.html +++ b/3.0/config/authentification/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authexplicit-activedirectory/index.html b/3.0/config/authexplicit-activedirectory/index.html index 472a98db4..d2f8c4362 100644 --- a/3.0/config/authexplicit-activedirectory/index.html +++ b/3.0/config/authexplicit-activedirectory/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authexplicit-ldap/index.html b/3.0/config/authexplicit-ldap/index.html index bc1c0576e..ae0e452a0 100644 --- a/3.0/config/authexplicit-ldap/index.html +++ b/3.0/config/authexplicit-ldap/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authexplicit/index.html b/3.0/config/authexplicit/index.html index 1608b2c82..20c3e66d0 100644 --- a/3.0/config/authexplicit/index.html +++ b/3.0/config/authexplicit/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authexternal/index.html b/3.0/config/authexternal/index.html index da1b46c73..6c809ca30 100644 --- a/3.0/config/authexternal/index.html +++ b/3.0/config/authexternal/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authimplicit/index.html b/3.0/config/authimplicit/index.html index d4b5dcf16..1a6f8bb6e 100644 --- a/3.0/config/authimplicit/index.html +++ b/3.0/config/authimplicit/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/authmetaexplicit/index.html b/3.0/config/authmetaexplicit/index.html index 52598197a..6ba8c47bd 100644 --- a/3.0/config/authmetaexplicit/index.html +++ b/3.0/config/authmetaexplicit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/balloon/index.html b/3.0/config/balloon/index.html index 26af5c6c8..6a74ace0a 100644 --- a/3.0/config/balloon/index.html +++ b/3.0/config/balloon/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/cloudprovider.loadbalancing/index.html b/3.0/config/cloudprovider.loadbalancing/index.html index 22c1093c1..b1e142870 100644 --- a/3.0/config/cloudprovider.loadbalancing/index.html +++ b/3.0/config/cloudprovider.loadbalancing/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/controllers/index.html b/3.0/config/controllers/index.html index cc192f0d7..6c0a88dd5 100644 --- a/3.0/config/controllers/index.html +++ b/3.0/config/controllers/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/controllers/manager/index.html b/3.0/config/controllers/manager/index.html index 61341df89..46b4b94c2 100644 --- a/3.0/config/controllers/manager/index.html +++ b/3.0/config/controllers/manager/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/desktop.pod/index.html b/3.0/config/desktop.pod/index.html index fbb416e58..7fb9d3ca5 100644 --- a/3.0/config/desktop.pod/index.html +++ b/3.0/config/desktop.pod/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/desktop/index.html b/3.0/config/desktop/index.html index e12fa8d5f..f5a177672 100644 --- a/3.0/config/desktop/index.html +++ b/3.0/config/desktop/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/editconfig/index.html b/3.0/config/editconfig/index.html index fbf9d7aff..17d9dc2d4 100644 --- a/3.0/config/editconfig/index.html +++ b/3.0/config/editconfig/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/frontjs/index.html b/3.0/config/frontjs/index.html index 7dbdf4ce4..1caba20cc 100644 --- a/3.0/config/frontjs/index.html +++ b/3.0/config/frontjs/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/host_config/index.html b/3.0/config/host_config/index.html index df6a62ec8..e01d6b111 100644 --- a/3.0/config/host_config/index.html +++ b/3.0/config/host_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/jira/index.html b/3.0/config/jira/index.html index 4fec5f00a..216b3c907 100644 --- a/3.0/config/jira/index.html +++ b/3.0/config/jira/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/language/index.html b/3.0/config/language/index.html index adc19c875..0c81bb68d 100644 --- a/3.0/config/language/index.html +++ b/3.0/config/language/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/linux_syslog_config/index.html b/3.0/config/linux_syslog_config/index.html index 09cc104ea..c6157cb34 100644 --- a/3.0/config/linux_syslog_config/index.html +++ b/3.0/config/linux_syslog_config/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/logging/index.html b/3.0/config/logging/index.html index a77084511..7c5c996cc 100644 --- a/3.0/config/logging/index.html +++ b/3.0/config/logging/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/networkpolicy/index.html b/3.0/config/networkpolicy/index.html index 7f01c1da3..d5cc94111 100644 --- a/3.0/config/networkpolicy/index.html +++ b/3.0/config/networkpolicy/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/stack/index.html b/3.0/config/stack/index.html index f122cbad1..29b3558a0 100644 --- a/3.0/config/stack/index.html +++ b/3.0/config/stack/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/sudo-kubernetes/index.html b/3.0/config/sudo-kubernetes/index.html index eca9d8a46..792dafab3 100644 --- a/3.0/config/sudo-kubernetes/index.html +++ b/3.0/config/sudo-kubernetes/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/syslog/index.html b/3.0/config/syslog/index.html index bfb1833bd..f73f789ac 100644 --- a/3.0/config/syslog/index.html +++ b/3.0/config/syslog/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/volumes/index.html b/3.0/config/volumes/index.html index 5448e1e5b..d568bfe17 100644 --- a/3.0/config/volumes/index.html +++ b/3.0/config/volumes/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/config/webrtc/index.html b/3.0/config/webrtc/index.html index 4900bd70a..07e58311b 100644 --- a/3.0/config/webrtc/index.html +++ b/3.0/config/webrtc/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/features/index.html b/3.0/features/index.html index b1d128c9d..44d226404 100644 --- a/3.0/features/index.html +++ b/3.0/features/index.html @@ -1836,6 +1836,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/k8slinuxinstallation/index.html b/3.0/setup/k8slinuxinstallation/index.html index a017c2047..d5f91f1ef 100644 --- a/3.0/setup/k8slinuxinstallation/index.html +++ b/3.0/setup/k8slinuxinstallation/index.html @@ -1848,6 +1848,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/kubernetes_abcdesktop/index.html b/3.0/setup/kubernetes_abcdesktop/index.html index c9080cfa6..7e7ed6355 100644 --- a/3.0/setup/kubernetes_abcdesktop/index.html +++ b/3.0/setup/kubernetes_abcdesktop/index.html @@ -1971,6 +1971,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/kubernetes_abcdesktop_applications/index.html b/3.0/setup/kubernetes_abcdesktop_applications/index.html index 65e7dd3e4..6c93bdd84 100644 --- a/3.0/setup/kubernetes_abcdesktop_applications/index.html +++ b/3.0/setup/kubernetes_abcdesktop_applications/index.html @@ -1954,6 +1954,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/kubernetesmode/index.html b/3.0/setup/kubernetesmode/index.html index 0ab1ba581..e2ea11488 100644 --- a/3.0/setup/kubernetesmode/index.html +++ b/3.0/setup/kubernetesmode/index.html @@ -1860,6 +1860,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/requirements/index.html b/3.0/setup/requirements/index.html index 4a2ad7326..8ac360855 100644 --- a/3.0/setup/requirements/index.html +++ b/3.0/setup/requirements/index.html @@ -1845,6 +1845,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/troubleshooting_core_services/index.html b/3.0/setup/troubleshooting_core_services/index.html index eddb78b8a..10e3238c3 100644 --- a/3.0/setup/troubleshooting_core_services/index.html +++ b/3.0/setup/troubleshooting_core_services/index.html @@ -1863,6 +1863,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.0/setup/uninstall_kubernetes/index.html b/3.0/setup/uninstall_kubernetes/index.html index 58d741766..ec9dc7785 100644 --- a/3.0/setup/uninstall_kubernetes/index.html +++ b/3.0/setup/uninstall_kubernetes/index.html @@ -1788,6 +1788,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/config/persistentvolumes/index.html b/3.1/config/persistentvolumes/index.html index 9d2ca129f..5cc873079 100644 --- a/3.1/config/persistentvolumes/index.html +++ b/3.1/config/persistentvolumes/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/setup/k8slinuxinstallation/index.html b/3.1/setup/k8slinuxinstallation/index.html index 35f53f572..fc69d6e53 100644 --- a/3.1/setup/k8slinuxinstallation/index.html +++ b/3.1/setup/k8slinuxinstallation/index.html @@ -1788,6 +1788,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/setup/kubernetes_abcdesktop/index.html b/3.1/setup/kubernetes_abcdesktop/index.html index 775a5eeac..99de09b37 100644 --- a/3.1/setup/kubernetes_abcdesktop/index.html +++ b/3.1/setup/kubernetes_abcdesktop/index.html @@ -1911,6 +1911,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/setup/kubernetes_abcdesktop_applications/index.html b/3.1/setup/kubernetes_abcdesktop_applications/index.html index 75f572ad1..e375eb104 100644 --- a/3.1/setup/kubernetes_abcdesktop_applications/index.html +++ b/3.1/setup/kubernetes_abcdesktop_applications/index.html @@ -1842,6 +1842,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/setup/troubleshooting_core_services/index.html b/3.1/setup/troubleshooting_core_services/index.html index 357fd0681..f627491c5 100644 --- a/3.1/setup/troubleshooting_core_services/index.html +++ b/3.1/setup/troubleshooting_core_services/index.html @@ -1863,6 +1863,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.1/setup/uninstall_kubernetes/index.html b/3.1/setup/uninstall_kubernetes/index.html index 5bc3f66f8..50cf86007 100644 --- a/3.1/setup/uninstall_kubernetes/index.html +++ b/3.1/setup/uninstall_kubernetes/index.html @@ -1788,6 +1788,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/config/persistentvolumes/index.html b/3.2/config/persistentvolumes/index.html index 6a118b26c..813b06c49 100644 --- a/3.2/config/persistentvolumes/index.html +++ b/3.2/config/persistentvolumes/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/config/webrtc/index.html b/3.2/config/webrtc/index.html index 876f2f7b1..328471a93 100644 --- a/3.2/config/webrtc/index.html +++ b/3.2/config/webrtc/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/k8slinuxinstallation/index.html b/3.2/setup/k8slinuxinstallation/index.html index b408de5de..e06f504bf 100644 --- a/3.2/setup/k8slinuxinstallation/index.html +++ b/3.2/setup/k8slinuxinstallation/index.html @@ -1788,6 +1788,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/kubernetes_abcdesktop/index.html b/3.2/setup/kubernetes_abcdesktop/index.html index 273ce23ab..bbda29c7e 100644 --- a/3.2/setup/kubernetes_abcdesktop/index.html +++ b/3.2/setup/kubernetes_abcdesktop/index.html @@ -1920,6 +1920,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/kubernetes_abcdesktop_applications/index.html b/3.2/setup/kubernetes_abcdesktop_applications/index.html index 458ae3355..916e7fdbe 100644 --- a/3.2/setup/kubernetes_abcdesktop_applications/index.html +++ b/3.2/setup/kubernetes_abcdesktop_applications/index.html @@ -1851,6 +1851,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/kubernetes_abcdesktop_windows/index.html b/3.2/setup/kubernetes_abcdesktop_windows/index.html index a2d06a598..491dc741d 100644 --- a/3.2/setup/kubernetes_abcdesktop_windows/index.html +++ b/3.2/setup/kubernetes_abcdesktop_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/uninstall_kubernetes/index.html b/3.2/setup/uninstall_kubernetes/index.html index 33cdce7bd..fe601f96c 100644 --- a/3.2/setup/uninstall_kubernetes/index.html +++ b/3.2/setup/uninstall_kubernetes/index.html @@ -1797,6 +1797,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.2/setup/uninstall_kubernetes_windows/index.html b/3.2/setup/uninstall_kubernetes_windows/index.html index 2097982b2..54570c077 100644 --- a/3.2/setup/uninstall_kubernetes_windows/index.html +++ b/3.2/setup/uninstall_kubernetes_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/config/networkpolicy/index.html b/3.3/config/networkpolicy/index.html index 98cef057d..f68d341f8 100644 --- a/3.3/config/networkpolicy/index.html +++ b/3.3/config/networkpolicy/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/setup/kubernetes_abcdesktop/index.html b/3.3/setup/kubernetes_abcdesktop/index.html index 43d28e020..866338be4 100644 --- a/3.3/setup/kubernetes_abcdesktop/index.html +++ b/3.3/setup/kubernetes_abcdesktop/index.html @@ -1911,6 +1911,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/setup/kubernetes_abcdesktop_applications/index.html b/3.3/setup/kubernetes_abcdesktop_applications/index.html index 7af5c3f64..c6ff252a3 100644 --- a/3.3/setup/kubernetes_abcdesktop_applications/index.html +++ b/3.3/setup/kubernetes_abcdesktop_applications/index.html @@ -1851,6 +1851,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/setup/kubernetes_abcdesktop_windows/index.html b/3.3/setup/kubernetes_abcdesktop_windows/index.html index 948fba3ac..60530f8c9 100644 --- a/3.3/setup/kubernetes_abcdesktop_windows/index.html +++ b/3.3/setup/kubernetes_abcdesktop_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/setup/uninstall_kubernetes/index.html b/3.3/setup/uninstall_kubernetes/index.html index 0eeeb2766..c2f61089e 100644 --- a/3.3/setup/uninstall_kubernetes/index.html +++ b/3.3/setup/uninstall_kubernetes/index.html @@ -1797,6 +1797,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.3/setup/uninstall_kubernetes_windows/index.html b/3.3/setup/uninstall_kubernetes_windows/index.html index 57f19f508..388e48e27 100644 --- a/3.3/setup/uninstall_kubernetes_windows/index.html +++ b/3.3/setup/uninstall_kubernetes_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.4/setup/kubernetes_abcdesktop/index.html b/3.4/setup/kubernetes_abcdesktop/index.html index 71655ce54..002a3ccb7 100644 --- a/3.4/setup/kubernetes_abcdesktop/index.html +++ b/3.4/setup/kubernetes_abcdesktop/index.html @@ -1911,6 +1911,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.4/setup/kubernetes_abcdesktop_applications/index.html b/3.4/setup/kubernetes_abcdesktop_applications/index.html index 2e436ae27..ff1d8f767 100644 --- a/3.4/setup/kubernetes_abcdesktop_applications/index.html +++ b/3.4/setup/kubernetes_abcdesktop_applications/index.html @@ -1851,6 +1851,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.4/setup/kubernetes_abcdesktop_windows/index.html b/3.4/setup/kubernetes_abcdesktop_windows/index.html index 970acc6d7..a72288262 100644 --- a/3.4/setup/kubernetes_abcdesktop_windows/index.html +++ b/3.4/setup/kubernetes_abcdesktop_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.4/setup/uninstall_kubernetes/index.html b/3.4/setup/uninstall_kubernetes/index.html index 5ba7ce6c6..279cd754b 100644 --- a/3.4/setup/uninstall_kubernetes/index.html +++ b/3.4/setup/uninstall_kubernetes/index.html @@ -14,7 +14,7 @@ - + @@ -1797,6 +1797,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.4/setup/uninstall_kubernetes_windows/index.html b/3.4/setup/uninstall_kubernetes_windows/index.html index 3173e5723..48c052995 100644 --- a/3.4/setup/uninstall_kubernetes_windows/index.html +++ b/3.4/setup/uninstall_kubernetes_windows/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/3.5/setup/img/add-env-variable.PNG b/3.5/setup/img/add-env-variable.PNG new file mode 100644 index 0000000000000000000000000000000000000000..40a51debb67b4c015279b0a7d27c2375f55af2c5 GIT binary patch literal 23123 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/3.5/setup/img/dl-docker-desktop.PNG b/3.5/setup/img/dl-docker-desktop.PNG new file mode 100644 index 0000000000000000000000000000000000000000..40e178208bb27e2cb1becee6172a5f6d47b4580f GIT binary patch literal 251762 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 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/dl-openssl.PNG b/3.5/setup/img/dl-openssl.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6491cb51a75c8b2f27ca44626ee75d9c89beaed5 GIT binary patch literal 165991 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 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/follow-install-step2.PNG b/3.5/setup/img/follow-install-step2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..46e5254615370c304b900405a43bba5d7bdf9469 GIT binary patch literal 24379 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 TkLmxo=lo0zEexvlUGMxI;N7>) literal 0 HcmV?d00001 diff --git a/3.5/setup/img/goto-edit-env-variable.PNG b/3.5/setup/img/goto-edit-env-variable.PNG new file mode 100644 index 0000000000000000000000000000000000000000..86efd0c7be6aca2743dac4aef2573558ab042487 GIT binary patch literal 17239 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 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/kubernetes-setup-login-anonymous-3.1.png b/3.5/setup/img/kubernetes-setup-login-anonymous-3.1.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c34c6029eef5fa95ee6d47fb987c51a1caa62d GIT binary patch literal 66708 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

    |= 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

    %e+>RAl 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 Qo$l+}6@9J3%a%|61|QjrQ~&?~ literal 0 HcmV?d00001 diff --git a/3.5/setup/img/kubernetes-setup-login-anonymous.done-3.1.png b/3.5/setup/img/kubernetes-setup-login-anonymous.done-3.1.png new file mode 100644 index 0000000000000000000000000000000000000000..0dca6cbb1228add3f22396d41515e5309a922a9c GIT binary patch literal 20025 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 To_+t8AGSVa`z!XuCMbZNV{Bu>z7L(!LL1grg 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%0D#puXv>+z$0|0v7%6Ca7%Ub}TEHnWJ4 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

    4>Jbw*2KU*YwmtG^%;0 zkLKJ`z2r`-`n)G@PyXkhW!r-P2hcd{8OQzmzu;3@-~NjT;=jiHzp+;Txc49L{#$1m z{6_Kq_l5e;c)7pV@E2)*qj>+y(PmNPN9%xJg!!L)@VC@A=5PG4#qPbvud6oq{bZ8o z|NPlI;QezJRP?{D)W6^V+YQ^vU+B~KZvCpH)&J|>zrB3S`OAfJS%Q_7^{?yqU~Io> z#>V!0Yp@iL-^YpVH`ice`^_BL*nSHXHn!h#la1}SdhlC4VCjj!)q~&a!4GrchkD?w zUogSO#yy~O`zH8bCd6+>$s)sVM){jjvbMo*M){jj{$Pr~?Wo^&)Q^4eKi-bY{eQVA v|Hsez$I|{USlr*!{Ov>k?G5|ibI|`HnAC|RJHP)|qiY>a!`tPz?mhiKb%-bZ literal 0 HcmV?d00001 diff --git a/3.5/setup/img/kubernetesaddapplication-2048.png b/3.5/setup/img/kubernetesaddapplication-2048.png new file mode 100644 index 0000000000000000000000000000000000000000..9de2c236db6461c01240a84c5d79cb44e71112eb GIT binary patch literal 439787 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 G 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%0D^zfNTryVV7XZ8LgL!I6U5?jLZp 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�hWPc>nz>@St(HfjlX$U<}5+y+LL3g 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 F+P|Hc>T3W1 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/kubernetesaddapplications.png b/3.5/setup/img/kubernetesaddapplications.png new file mode 100644 index 0000000000000000000000000000000000000000..d647828248e77b4c8fee83f66b4c9999720a8d0e GIT binary patch literal 480972 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

    9B4ks{qUxtv1R!3v>@PkZEE0F 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�Z~Kly9^r=A9*NxF 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ÐiT;k*Y{h;cIoyM+D?D5f#UGUII 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

    V!$&0mex`HQoOY|7p!^Tb)rzrqy*w%-#W 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 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/starting-docker-desktop.PNG b/3.5/setup/img/starting-docker-desktop.PNG new file mode 100644 index 0000000000000000000000000000000000000000..76a411959c07931bf7365d2be92d3eeb2eb07ef4 GIT binary patch literal 29110 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 literal 0 HcmV?d00001 diff --git a/3.5/setup/img/system-variables.PNG b/3.5/setup/img/system-variables.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8b85e8961cc12680d9258cd2656be29403134714 GIT binary patch literal 17402 zcmd742Ut_t*Ebr6QB*|6u^@e{sE8;CNLNu1sZv4*5dk4oL+BwE$~aOSkuIP^CxOsH zs6j!A)JRK&KmtY*NCbosLJ~r5Kxe-Hz0dbP-}isN_r3R?=P`KBK4+h`*Is4s-&*TD zv9d50-z~ix004-a+_+{90Q>|80Jg>L+#$TOZntJhQ0 z^M}vjMF61; zB1EJA`?b%feg$sc9pbPH{=4wFg!u6c@W(Ss9tStu6Vt2z*lh2-xz)uxj}wT^Ed$c z-s%F|nAD~|PLE}9Gu>lbx8K@T-0QCJ?KL50zX0#v}#Hu;eMwjbuB{__cD zfct8~#kl4<9Jli8V*54N02y)e?S&UlI!eWIZ$V8TI1khadOGe@Ru0qJ*O$QuRzh7j zn5hO`Udy)~k;f(sV^UmCR@M!vp!AJ|6Q%p7qXVBv-T>NWCX)}BytX4LU-WM_#LrfDR{)`dRH|9q9C{tR&3@1X#t} zK@}o%{UD!aSkU8MIehCm&&^&Q@?Tb;snC3gesE7z+uiLayOkXu_rTN9FVl?UM(;Zp zSCuC>oA=W4tH&!mK@OGdr^ECg&$U)-C)Qq^HTPh!$B{+QPo`HLWa*&*4c+62jB&qp zZ9RU=UveHO$3&F^zB=IG4W>4Of8U06VN=xJ$nOW9IGf#m#?mlb%)!8djP)x0B}^>* z%vY(PJ+9A8F}VYrrd8m5Q-?N`dbw%hRkl{F>9`CK1c{3txnj_!0xj5hd9{6ndw5gc zZ%ahg(K~I|!%sjygwkI%#Dwdpi09}#G5pfJOkc(Hg><3rfqIJ-5o3J=x;^*0kg10EdnjklAtV$q&=?CPu_ z-(w-Q(-!q(+cqu+P*vU*#I}(dW>OhQgKncm&GqUgpWN_GrA~E+`DHvY>1kgNJ)!d8 zx*lS|RU|5~$H@vjm{+jFoq7%ccu^KVYJFZAs-W~z6=9(>U+>r@(1@No zsSzgNlootejba9lUJ!lkJB-Qm%rs%V)ZksZIKc@x|1uHiFp1u=GU1@GMc z^+|_TX9dY68GU(IZOu8Ed0Ajuo?{Schlv~}rj?`Pq7yjpx8qTha2@khtZ=*ffb5+u~-6w?SM@RtVs=CL+*T1V6E7o88N+}U01W*6AKfZc ztJ@I>f3)$#O$`A65^sN3sm=di`dNuMe``};0Dw0~9L54uf7SDOj_X>QU8J4a#IP7 z#bYfmN1;mcokcTa4mK{jldHHd8rS!MKAaujf4%ABcKva@g_^Q1R}=a|RE& z+hZdwVXDcnxg3@MEGURy`s(Us917ybDz~?)IURMF# zM|c<8S7RzaDt4is^9~j=hk0ha9`=0nNG7=DIm8{-OJ!Jz{F0XBQ*KEO%g{ODXIw_X z;GD=iTsKTPtuKuE(_7#}$hix?IN= zNRn||!IO>EZfuwSGZc~{`#@w%HiQOtxNvG!@+(dB>iWg38}gS-IJ?-FcS;<9^zAcv z_La*c`n*y&-zB10Sh`17qPv7(qKZ8By!mrexgdrZ7auAv#dy_}5+jF(SUX6D==s%U zFjazv!+R%E>8B=ZA3TIJnXG-*x#Lxm!lmYojnzmOPUA+3s0B+l zB5VfDL+#}WB5G%=1--NI>!Up5YK+-i|xq8kEEca!oX*pX--{TXGA$x@5CH zvaP>%dbc~UkP4KVMIUpXZdHs+dp@X3wme@X7_h0@-(oz}9bZ8uUJ|t`TBD~vNrd4N zL@kE&6%IU4jE{XYi_@dM0ekv8xgMaJI7md15^xK!(a1SzRs59+qo#!;9_rf0^aA4X zfF<{~5{6Uo{4;aM(aAdRPy-d(CkClC17oqIA9NR|I4YU~S4j3U4m3z)f=hnEvg7wk|Dz=+;c*_5&xcj!1kVi4Lq!f;POn^uDBR z*B@rU!3*TZINy+|)WdW@u1 z9r2VaW3)hC^fTsKW{-m_%~{mx%P5no6Ch1}&6UT6trnTh#e41ERC=PC5^2|JQ$U0v zM)+SFX4%L;C+nm|%ERYyY)0;&ad(@P=e^f7V|E?lBbL+FN0wVcxaxH6Hzeb(h4WUj z5>$n3-kSMfQuUdqXD>|tqRW?%ZLgjeZHCQGwB|WSPFp-`-+l9<#6Mes7oj+r?dUh|M#d-3BPT^S|Q&rws&50|}e^um5p;S82c#lESs< zrcV?)&d@-+|H8)7J@ADB{rZiuPWDrQ;y%yh`wQehEP7n4nr-2I%Q%%CG{ymD#(~bXP6UP>RBzZK(UQkYR3TFdGe>+8xg4p?u)KS>u_($hE;-p5vPbRB8dJVQicgEJ0&@Upx|0``;x|PmQyGoj zMZ_a(+dskbRH^Us83dM>mjS5?X`(YV@*x6)vG8d z^z5ZYMNh_YZ*IFxf3f-nbWg510Am?6KZGm)>Xw8$MMLZ|@|O9$`yi)o*g(^dfEaCR zXxk+m;$u9N{EbNi)(7baV2mH;WZMRq9FR}V0uoDT5 zCHSlp^S`=|DSM0-q>+pZVaJ9-mfn$@41DHw<-e-bt)TL^diG;fWmdBZB@InH2qG>SU zx8v9h##)#c46UYZ4_gf|A=2AhP{=5iMG|>z(%uhUw{hR<*m+T8yByt z6nQAElrj<{k`$kN4ql&RJ=Y_kO*6}r({c^2Kn?c+^;|tO^n#*!YrysvOX$@)*s

    gtU^&?|yfAx2(jN^N&%a>6f<;$sWPT#Bln0J=g{MTgHcW>IdHshxI~RRD{hWx8;oZ7^tDf4p z&l^bsS@zR~LjOIobFH<#2Ts*DT}(8p0+;0)aBjC{T#J z`#JL6n3gXscQ?WYh(-G0DY_zeBmEP8f6Uu*_OK}Q}%?5 zH=&8B{)UQ%M%9X-M`KVKuXnh!nSF&og9?fXtl4u&6UB0rejMsH+I8BqDKKeCHfwM` zWR^ETHzU9vA<{ea=eZhH#_oz;&8fu;9sGZ>uInC{ z2{bF|CoE-&VgE!IwtfiBozi`w@F=jgQ1nk{nRwAOB{<%=WuUN^qv1V6onoH!%H$By zfkWJNtxVHMutU$g(Jq;59(6bJb-b-idB3$$lboJdv*kgcX0|50kxg!j1D@}24_y*%uQ;G9cP?`Tgnd%Yb}N2sn1-DP-N5z4Aq5JnbPEX>qK*E zH2zMxN?h2ccsFXVgxFg~A!jf*2fbYR-E|+y6l?GItyz9dsB~tgD$?e%Esn^A%1~OW zJ@l_{s`DU+%k7W+NHk78qxmPUFlIxH6LX#m&c`l=H>bwvp&5yc_p}#SUpjeC^ySQl z7?oy3OG&<{TK|RpE^TK-%VNQ0tdn0@jE%E>HjJG8uiJ;TeI{6iU>7-X^i7!ClY`pm zGfh?z&#UQU9)ZHRC;K zcZK_VdJO%yzR59!L80dWT@O34Ah5UgOS3T4vSHM?3vKc#R-}ZVS(G&*Kmh)-UflcGW@ep9g;cL;vHhE!1agW%Cbe^#5Yx^a~HWjX6|i zM>~6cX*CM!xY70|l|cke7f8H-xqV{=oY|+J!C2`NxWR0*Tkz|a2X?RwcKM_~K~j)# z7tW%bH{=@oV0G1SvstXgxB+OKG~9KWHpRX(YO&3A!p7&Xu99FlR>QLq=Q&Fu zuoeA-M;5ZcdGRQB2W0`T(|VBsazSJ8@32G`q~aL=X8Ns0#z`#n)B-R384Xa$eM|0D zp4zoMISzAnETBC8Yxj760~;OE{744*mFJ7-@S^jz3Xm!7?eQRViWq}iA1lx!5EB%h zI!7-z2)7Xv3P08+lFY_zZx^5=t3%U=}{M-5{w zd>mXc&cj_sW7$#UditlxiP>RScDoRu1OSqL=;ftwhdhC-Xu`#_2ywW=MhweaSqs>T zzow>3yZg|1`(H=9P}W1Q4zL|nI9k3i4I-u_xxY3a2y3R;f_0FR;TqmFubaJTXjPoPAn7owR zSu4yqq~Z3WMvKW+^#K12Ry}ukx~oq?&G63L8cAO{*%huQW5T^^sVkgi(c9m}ct8QD zI8mY}x}8n)qL6+C4jW)u#SmISCyVZ7?K0(iNi z+G@40;57tagJ~JK!J>yge@SI|k3dvMmRfP+^#i^QP;(h)FCQm8wbwh&-HuVyLchWEZ%F@h7p^Hy*9dLYFXzRm(ElByw54$1+Fce)PKDK*9rf8!c7n_|{|$DKE%>8vqdYH)qZunuBluoIJyOA7g`Kytw=jO;M z07O&V=;Rd)#vabBLu?ZV{REiOs@X*1(-KD6jQ5|i(Ec~03iUHKtt4h&dwZqC0l;Y= zM-gfK&ww{-o|}M&(0v3No@>2w9}8?P=8PnBDf3+Ja#Wl1-Ulk3zW4_T>e~R{MmA#r zn{g>vq3y)ewEmCn@0(h2LEs6b>~OMm(8wHZmD7PGGGfdWg6bh9F|mys>xbrN?zbJj z@-ELnR8lFTh*dg&+CBO+-&%i%#1}Kr<<1-cAi{ey05KioF&c0Pj`jm%}y(QS^xYX z7ueCj!sz`64&E4dXTS$QWc|+bBVD5xzDa+KV;W8mM3ytWggMbY9=?sjz*NJ)4}m8R1GkJo(uO{KuG_ON{jpTCDaquo>N4sw)IzV9fWbiV_TCX zgtYh9a%Kgujy{v;eMxp29W`FT!y{uoJi{Pnw67rLBReTLP@yD6^7*YYf9+ymN~o1}1!)+zyzT zb=xZML~~%1+_zH}wL2~%b^#ugc5OyOETnpcmxv0m8?h9B9-idf+dlar-OdVAhU{g9--ElGOPDfAUW*2HbH<{y>&FIAlF zo9+kzkbU%@dPPThC!II5mFmF_<7cJ5zdLhok-6^ybDCOrA#sx3CH;FZ4;9?B;J8g8 z2x(Y(1ZIgOXnHPT16VV=m(BhTpjM)csA-ge?XZihmQGn7Z{$JFl z^ElSodd^~M-yP3{(e=pRUX0TRj=cH_Ae*u!GOCE?i$<1f(V2T8OaC3clsHe z7JE4}0}t_}!$9{^h08OdpX?!pLiq6kZ%g16_rNzQ{Xz;%G-yVS4{Sb@GrHcMjjKHy z*X{giR#ZpfYe(rfyn1W;LFR1+JrsL#GiC&sty1XueQ-(lFqNUYD}A9qqzo=spBb%6 zy0l+t4;P;Pkl>v5pOQ^9JF1`1HO~Qjj1sGlSCBs=K`2%4L^_$j~XmdK~*8&QCgRaIN^DKB&N9mlMi5h$e-uo=` z>^lx?P!1?&@aY5yVbujw*ly0zjko2b)@3kEbyR{PWe&ygR`l)-MdxJmrjmtS2HXEo zU&y$h%hX72GV#I6j`E&HaSSCu{LQz<%csC@iSHw!2OfC~*IU7$GqF01tGAn1Yau=f zW`*YG-dIel>xWkefT%(J$1C}PYhlF!;*Fk_e{2KXR^K#m!9&$&){^@IjNbY)cgfs6 zd*xt$e581pJ4-C`!AjBFDmh>sMB`vXENTI^vo&2Q0b5iFo(yp{1*i}TO%_id9ZA=d zq&6HTivZr}Z;|@$dz{#)<42tM{3U$Qjn-D#?SR8#e*^A9Z~Je=l!xO+GhsXxVG7SR zS=%4s=gqW~M(6*U6Jhv31(w(DvPNbg1^HnP?Se%v!vINO3#wC&q|95wHpr3UKX1^Y zOnTNSTsKDrY*jHhi_8q*^E}b|FK`O54Olma@pVq%RM0Dgv-sHMyg>KK)!xC zxd0BEOKZb@!*if4UKnnj=}ss}QZ0{<5>Q~&o8EubATyqpp;?Zrt*g3zm6ONtLnNPX z(h{H`UkkZcTalzvarn~lm9%28>W7~!<&WcPgO@;aw1CyA94b1$7nQhLg$lI>@n5^z zG~9&?;)g<{Qd42E3)K6Kf(;}iG2f8h)Pi;&77ypC>8`Zj&LeBfht4}L1i9s=Ur-|G zFa+nU=RY)a1k31{nDpOoH8=0;@xAd&~Ou+s5m51kb z+95H6mjbu1-VSdgZJcQr+s)^hbCsQSuu5AN!Y1BM zYN}vk-C*!`|Kr0FW(}`8FPDnJg9eZ3Uq&CfsPXyBm2CZQcR--i>l{kKQqFFfn=$;D zJTK5G|2wAH){`ujFsFo$iJNiaXpOJu_hMIk!rQ)Ls2D5g#3LX0Ee(=fhgs}t4PjYMjAs(ib2(|K$m1hb*{hC)?w@&JuvLFZC0(K}j~naKw!b2I zX<{J|xinTGxVL>%&m;b*rtc`a7=q~j1(q+WTZN1HbTs9!=qbd@f_N=gchj!%U>X1V zBiqxs^Qu(~Ge>+!1Iq9qr^I{yYh%)uEcRhALlSNfSWwAZW=~hSM+aWyxsS@F6LMWh zCDv18mtx=ZW-k%AXPtz=mqiN>Dy5fMBr(BGuR&L`UVpk2IDpRQOg2{?oZ5W|+c$L2 z`F>%k&+b;Woe1KAj7A9j8h7x`YqAuCHC~<+^Uuxy_Rb*q9D*(fY*}|8tK%It|g^O zV?t9JeoeBgXjBnIea;Vu6$e}>UL|_sArr0W<#miB(w_TTx1l^LCBl>)Sg%ZCMq#yD z7CTzA&ALJ_R0J{A+xjExv+$W2zAL6{7H1pKfuw=8oFR>J89riFRE zE*aW1&!Ka^iLy@@J?x^zpcMs*#^1FE9B-#-H8<7x@QI?ah9l6->fMnQa2Q|2SZ_`7 zDX6H+N}7cQ|r zWc}Ad-mD&>0)FXavi@lon;r*nH_NWZ;O0#kTZ2mdsw&5?IENO}3Q7BGGtl4D?EqJ| z#R8Ido$1Z>C)voBgt-sr8;^npylPqY^vrLrwqc`}w8X$(&59g}f{cb6Isz^dp$8v# zzQ?0;P}W<1EB`#g=rKj#@?Dy&cMv(tTPkmr!z z*Ch2Kg}*q>xeoHr6caJHO9>0rY9`E+k>iV?KuToHPsucm%8sRi+l|h z!OI7~yO2!1|63nxNH&a2mVbak-K|Oe|fVi zjCV|*t2?fct3HeYtvszT&{y=BQF90dD@J8jY#%$?XQ2#_q&#i%i4u_x!TyP9IkPvG(4Kd~?!- z%~0e6KZCf>HWVg`EyG#|--fgiBz`MsYA9ML{E4b&Ao3$0@95|09_ov$R`35PLBwGtf=STf{fB0ekDq!Uq?tSmY zVe48>2|jVE*8y}UIJaGSwMyc(lks*&Ys7qsKg_MZEV(xW)4(eX3p%}!6W@TvM)6b_ zg+}eNkEad77})xFsWPwMUHX>O=*83|h84QZ$J5XRHwauJhUpN97=^Xbp`-Eg{W z7Sh@NYNhMLn6JyUulCrjLC63pyBLb8Ia!(-G?KZKsnj=`~KN zEk@37WMR=hl#7qjv4njUfoyUNtU`G)h*PILUCog3!au9`q_q7E#G}e5z1!opN@$e= zlKWqi^4W=cM}nvK6RjD!q_8S?`}r_suN9~z^wzzF%&lF^Ca`F704CYfXyTl`hObe7 zTFn2rBr!E3%YK8>eCOo6?PjCaz4dSVDOBL=r2O!}l-|d>#H6^$O1T5TXkjF5uMDGg zNE*!6b*&F|DU++4mCHmyT^A&xJNr!xryuS9t$zcq+e?=XS5k(PHH{C0Cm=Ig#qq{_DGvRq0peX=^RcHe*_cIvtR^X)laL!u#Bl)yk0#)mXnF-2RAx=Q4COS$1VlytTAiQ0I$JMOUDA89paE8Kc?!E90-aWNo@F#+elTD70xNy1M3|)A4bb;i_yj)@i<{S!F zNIz|jaeIXptT$~$%yTmC_pvHf^}wAT$%7@)*$$2bYM3J73C~I}b{Kv$dSYVld~ii{ z&00}I7IgoZ+PT~UkK!;$mCv^=Gw0jsr}~g`ec`0@MXl|OmM240Pm9ml#G~IvdPr0K zXJUTUlNj{Q4mEs2i&&>cRI&Sco_OO$)J0C@hIV(jsIH2cwkBE`>N=l#m8g7^AQsAU zPimoU=xcxGj$-cJk||7Q*EUqm&!^xkMq0i?F+mgTz`eHA{K5Q)vs}*0h7oQFIxnPY zNEe>+Fffxh;f9;q0zHN68fnVOS7xe)(3BBRbG%R$w5NSsq|nb85L4lNQaxVt*73EC2AEib{0$u8mJHaELA1!zexoQLf)@5fP0&JekT@>?}Th^ znz}nGV6%=`#Pwq=hcrn4ow?j^gO43xDW`<`|0Om zdC+pD<5||OAj{xzSIS$UpTy;>8aTe8daliILP)L!SPFEm;?*l!<47U-VhPiYo=+?s z4|~TgBh*mG=~0QgDm?@?b|^aJ8l@J4Wa3hq+UD4(hRF3bXSSCscGduruj7+#SrEhD zRi|>ukHCf~mo7ACq9FYRnyBaws3N}v6Hb#Nhu16SCW^6xOe=$i!ZL^rQLd1BP*W)# zd}zx7MpOt>bz+Qmu6&WuwkKtI@t>YByXW|#{C+dsAp7gX$RRlB#kk0`+X2!Zu~_DL zXE7rwPt2Uw0u7{{S|)b-ItMI zOdOT{c0A;taIBZkuEOHWPC6(5M@Aws{&Iz(?;OwJUv9c3YQt|T`X`66*7f|}GQBHy z|B~AO)OEk@^?!LHAjs#@^p@=O`!EUz&C?T&kp0l!XP8A%HP61(j)e## zet(4TW^JX&2XAh~E(6;0CGAX5m#OL2yETTfrfXW6NrWaBH8&?A%RU2Yv-RCNa7}kx z2WE1XhBnJ9MW6MrEd3fgaN>VKTFi(ymx#_3){ICH7GYno8*3Y#tQlg^7#l~=?nsr% zm6U36h?adErOW>WYuPxIu9bEyHB(Ptg`j{Dcw`_?Q|f102mc{N|IGT@8&ysxo1s8I z?1B1P*rn9y<)1@aU+sS>TByAoF$U!mS-E1BjM&Q#azIfz?B5KTD(pxl?`&@|w+;F| zZnQR48u^S68PghqR*6BF2$)%kN2V*mmtu!vNy0GKHli^I{MT)yli)Ouv zqu|gSF^E2KFn6U*PHX*MGw3w+6GJO&plrm;N5@j_Au%^W0ds;CB={X= z&sg0h#P-~d1n=$yyx581+LWt+s1$mR5 zL!Or!w>sNci{&5L{d5$fUXCrdBS~YaTH(Qe&)-_vw>1Aa{K;nj#^n;*_T;7Zq0nu% zd5lMM?70@N$MpjWy?=J5;*qpPq9#)b9b@kZCQ%}j;rQf6rB!lvc4OAc`oRD`7(m=&Y2d^N)@={+1 zeOK4%OUn`26be^aPNW7^wQ@*KKvJXq#$7Llr{Z$vx3ewq<}5^N-r6 z?lp+0s{SL1F!m2y{_|S-|AoP@lK-+6QCU+{Kk%LhN=`0@oFln|{G*QlpVe&t8#Y&1 z2>b6=jN^qI-wZ~qouc^X#BUX@zq|GSYl^o@jN8f7es+_n-_xOt?<_Sc;<@XCG5cq+og{NII*wnu}#KB!-*Fu`TIR{Y#y61;V1i;ptHBk=t>x zTk@jcRG4TdTtcABdTUO-Eb$mkoVZ0U+hHsLud)>58$8-{*zXj>zgE*le3r!Xqru!x z7EfV=sf^&F9~O$*g?z0ZpA}54?}+9o{bbU}@?4rne@g(iCOcXQ)E}?q%+;*8Z1FKo zC)5D~BiFBn9~(Y@u%jZDqFrm4IO;8k7OZV3?|ue8<;pdP8*%YBDkJ=qkzwJ-Xv4(cRK@>jLEQ8TTeU0Geuf$WnSBhJy$O4t>L1WnY2+UBkaDofHiJp*%12b=^0%C9CEV;vCFgb?+?^;mzVuhgn#uSibM8 zP|8PPA^XF|V`uko){hrV40h6&sTSK$GWva`f!BExf6D40{^-iJSweFJK6auv*;?nw zJK@7L|Ffl(X@lw>Y-GhEu~PX5x7VxB3byA%$kSYMXmwelCZeM z25m^cSHGmzr+cGn_OsByo(__pNa2`>7dtor^pERdCe#}#a|QJN*P U_d#?vGaO8=TU@KUdi&A;1r|gVQ2+n{ literal 0 HcmV?d00001 diff --git a/3.5/setup/kubernetes_abcdesktop/index.html b/3.5/setup/kubernetes_abcdesktop/index.html new file mode 100644 index 000000000..2b6fde62c --- /dev/null +++ b/3.5/setup/kubernetes_abcdesktop/index.html @@ -0,0 +1,4614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Setup abcdesktop for Kubernetes - www.abcdesktop.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + + + +

    abcdesktop installation

    +

    Requirements

    +

    You need to have a

    +
      +
    • kubernetes cluster ready to run
    • +
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • +
    • openssl and curl command line must be installed too.
    • +
    +

    You can run the Quick installation process or choose the Manually installation step by step

    +
    +

    Linux operating system is recommanded to run abcdesktop.io.

    +
    +

    Quick installation (Microsoft Windows)

    +

    If you are using a Microsoft Windows operating system please follow the dedicated link below
    +Quick install for windows

    +

    Quick installation (Linux or macOS)

    +
    +

    Quick installation can be run on Linux or macOS operation system.

    +
    +

    Download and extract the latest release automatically (Linux or macOS):

    +
    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.5.sh | bash
    +
    +

    You can read on stdout

    +
    [INFO] abcdesktop install script namespace=abcdesktop
    +[OK] kubectl version
    +[OK] openssl version
    +[OK] kubectl create namespace abcdesktop
    +writing RSA key
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_payload keys created
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_signing keys create
    +writing RSA key
    +[OK] abcdesktop_jwt_user_signing keys create
    +[OK] create secret generic abcdesktopjwtdesktoppayload
    +[OK] create secret generic abcdesktopjwtdesktopsigning
    +[OK] create secret generic abcdesktopjwtusersigning
    +[OK] label secret abcdesktopjwtdesktoppayload
    +[OK] label secret abcdesktopjwtdesktopsigning
    +[OK] label secret abcdesktopjwtusersigning
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3
    +[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop
    +[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config
    +role.rbac.authorization.k8s.io/pyos-role created
    +rolebinding.rbac.authorization.k8s.io/pyos-rbac created
    +serviceaccount/pyos-serviceaccount created
    +configmap/configmap-mongodb-scripts created
    +secret/secret-mongodb created
    +deployment.apps/mongodb-od created
    +deployment.apps/memcached-od created
    +deployment.apps/router-od created
    +deployment.apps/nginx-od created
    +deployment.apps/speedtest-od created
    +deployment.apps/pyos-od created
    +deployment.apps/console-od created
    +deployment.apps/openldap-od created
    +endpoints/desktop created
    +service/desktop created
    +service/memcached created
    +service/mongodb created
    +service/speedtest created
    +service/pyos created
    +service/console created
    +service/http-router created
    +service/website created
    +service/openldap created
    +[INFO] waiting for deployment/console-od available
    +[OK] deployment.apps/console-od condition met
    +[INFO] waiting for deployment/memcached-od available
    +[OK] deployment.apps/memcached-od condition met
    +[INFO] waiting for deployment/mongodb-od available
    +[OK] deployment.apps/mongodb-od condition met
    +[INFO] waiting for deployment/nginx-od available
    +[OK] deployment.apps/nginx-od condition met
    +[INFO] waiting for deployment/openldap-od available
    +[OK] deployment.apps/openldap-od condition met
    +[INFO] waiting for deployment/pyos-od available
    +[OK] deployment.apps/pyos-od condition met
    +[INFO] waiting for deployment/router-od available
    +[OK] deployment.apps/router-od condition met
    +[INFO] waiting for deployment/speedtest-od available
    +[OK] deployment.apps/speedtest-od condition met
    +[INFO] list all pods in namespace abcdesktop
    +NAME                            READY   STATUS    RESTARTS   AGE
    +console-od-844c749f85-vbbb7     1/1     Running   0          32s
    +memcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s
    +mongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s
    +nginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s
    +openldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s
    +pyos-od-8d4988b56-vcd7z         1/1     Running   0          32s
    +router-od-f5458658-b52hj        1/1     Running   0          33s
    +speedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s
    +[INFO] Setup done
    +[INFO] Checking the service url on http://localhost:30443
    +[INFO] service status is down
    +[INFO] Looking for a free TCP port from 30443
    +[OK] Get a free TCP port from 30443
    +
    +[INFO] If you're using a cloud provider
    +[INFO] Forwarding abcdesktop service for you on port=30443
    +[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'
    +[OK] Port-Forward successful
    +[OK] Please open your web browser and connect to
    +
    +[INFO] http://localhost:30443/
    +
    +

    The command above downloads the latest release (numerically) of abcdesktop.io. +The quick installation process runs the all commands step by step:

    +
      +
    • create the abcdesktop namespace
    • +
    • create clusterRole and service account
    • +
    • build all rsa keys pairs for jwt signing and payload encryption
    • +
    • download the default configuration file od.config
    • +
    • create all services, deployments, secrets and configmaps
    • +
    • fetch pod user's container images
    • +
    +

    Change the default namespace

    +

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    +
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.5.sh
    +chmod 755 install-3.5.sh 
    +
    +

    Run install-3.5.sh

    +
    ./install-3.5.sh --namespace superdesktop
    +
    +
    [INFO] abcdesktop install script namespace=superdesktop
    +[OK] kubectl version
    +[OK] openssl version
    +[OK] kubectl create namespace superdesktop
    +[OK] create secret generic abcdesktopjwtdesktoppayload
    +[OK] create secret generic abcdesktopjwtdesktopsigning
    +[OK] create secret generic abcdesktopjwtusersigning
    +[OK] label secret abcdesktopjwtdesktoppayload
    +[OK] label secret abcdesktopjwtdesktopsigning
    +[OK] label secret abcdesktopjwtusersigning
    +[OK] use local file abcdesktop.yaml
    +[OK] use local file od.config
    +[OK] updated abcdesktop.yaml file with new namespace superdesktop
    +[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local
    +[OK] updated od.config file with new namespace superdesktop
    +[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local
    +[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop
    +[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config
    +[OK] default account is created
    +[OK] role.rbac.authorization.k8s.io/pyos-role created
    +rolebinding.rbac.authorization.k8s.io/pyos-rbac created
    +serviceaccount/pyos-serviceaccount created
    +configmap/configmap-mongodb-scripts created
    +secret/secret-mongodb created
    +deployment.apps/mongodb-od created
    +deployment.apps/memcached-od created
    +deployment.apps/router-od created
    +deployment.apps/nginx-od created
    +deployment.apps/speedtest-od created
    +deployment.apps/pyos-od created
    +deployment.apps/console-od created
    +deployment.apps/openldap-od created
    +endpoints/desktop created
    +service/desktop created
    +service/memcached created
    +service/mongodb created
    +service/speedtest created
    +service/pyos created
    +service/console created
    +service/http-router created
    +service/website created
    +service/openldap created
    +[OK] pyos-serviceaccount account is created
    +[INFO] waiting for deployment/console-od available
    +[OK] deployment.apps/console-od condition met
    +[INFO] waiting for deployment/memcached-od available
    +[OK] deployment.apps/memcached-od condition met
    +[INFO] waiting for deployment/mongodb-od available
    +[OK] deployment.apps/mongodb-od condition met
    +[INFO] waiting for deployment/nginx-od available
    +[OK] deployment.apps/nginx-od condition met
    +[INFO] waiting for deployment/openldap-od available
    +[OK] deployment.apps/openldap-od condition met
    +[INFO] waiting for deployment/pyos-od available
    +[OK] deployment.apps/pyos-od condition met
    +[INFO] waiting for deployment/router-od available
    +[OK] deployment.apps/router-od condition met
    +[INFO] waiting for deployment/speedtest-od available
    +[OK] deployment.apps/speedtest-od condition met
    +[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready
    +[OK] pod/console-od-79bf9bf475-gbb62 condition met
    +[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready
    +[OK] pod/memcached-od-d4b6b6867-c8b4p condition met
    +[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready
    +[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met
    +[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready
    +[OK] pod/nginx-od-57dccb8cf9-txgzc condition met
    +[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready
    +[OK] pod/openldap-od-6955699d5-qhjzr condition met
    +[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready
    +[OK] pod/pyos-od-777747f64b-r87x5 condition met
    +[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready
    +[OK] pod/router-od-59d67d664f-f56m8 condition met
    +[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready
    +[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met
    +[INFO] list all pods in namespace superdesktop
    +NAME                            READY   STATUS    RESTARTS   AGE
    +console-od-79bf9bf475-gbb62     1/1     Running   0          12s
    +memcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s
    +mongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s
    +nginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s
    +openldap-od-6955699d5-qhjzr     1/1     Running   0          12s
    +pyos-od-777747f64b-r87x5        1/1     Running   0          13s
    +router-od-59d67d664f-f56m8      1/1     Running   0          13s
    +speedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s
    +[INFO] Setup done
    +[INFO] Checking the service url on http://localhost:30443
    +
    +[OK] Please open your web browser and connect to http://localhost:30443/
    +
    +

    Manually installation step by step (Linux, macOS or Windows)

    +

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    +

    Install abcdesktop

    +

    Step 1: Create abcdesktop namespace

    +

    We will create the abcdesktop namespace and set it as default :

    +
    kubectl create namespace abcdesktop
    +
    +

    You should read on the standard output

    +
    namespace/abcdesktop created
    +
    +

    Step 2: Secure abcdesktop JWT exchange

    +

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. + Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    +
      +
    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • +
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.
    • +
    +
    +

    Please use the payload private as private key, and the payload public as private key. +Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    +
    +
      +
    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • +
    • +

      The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

      +
    • +
    • +

      The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

      +
    • +
    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos
      +

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

      +
      +
    • +
    +

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    +

    The following commands will let you create all necessary keys :

    +
    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024
    +openssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem
    +openssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem
    +openssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024
    +openssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem
    +openssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024
    +openssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem
    +
    +

    Then, create the kubernetes secrets from the new key files:

    +
    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop
    +kubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop
    +kubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop
    +
    +

    You should read on the standard output :

    +
    secret/abcdesktopjwtdesktoppayload created
    +secret/abcdesktopjwtdesktopsigning created
    +secret/abcdesktopjwtusersigning created
    +
    +
    Verify Secrets
    +

    You can verify secrets creation with the following command :

    +
    kubectl get secrets -n abcdesktop
    +
    +

    You should read on the standard output :

    +
    NAME                          TYPE                                  DATA   AGE
    +abcdesktopjwtdesktoppayload   Opaque                                2      68s
    +abcdesktopjwtdesktopsigning   Opaque                                2      68s
    +abcdesktopjwtusersigning      Opaque                                2      67s
    +
    +

    Step 3: Download and create the abcdesktop config file

    +

    Download the od.config file. This is the main configuration file for pyos control plane.

    +
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config
    +
    +

    Create the config map abcdesktop-config in the abcdesktop namespace

    +
    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop
    +
    +

    You should read on sdtout

    +
    configmap/abcdesktop-config created
    +
    +

    Step 4: Create the abcdesktop pods and services

    +

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    +

    Run the command line

    +
    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.5.yaml
    +
    +

    You should read on the standard output

    +
    role.rbac.authorization.k8s.io/pyos-role created
    +rolebinding.rbac.authorization.k8s.io/pyos-rbac created
    +serviceaccount/pyos-serviceaccount created
    +configmap/configmap-mongodb-scripts created
    +secret/secret-mongodb created
    +deployment.apps/mongodb-od created
    +deployment.apps/memcached-od created
    +deployment.apps/router-od created
    +deployment.apps/nginx-od created
    +deployment.apps/speedtest-od created
    +deployment.apps/pyos-od created
    +deployment.apps/console-od created
    +deployment.apps/openldap-od created
    +endpoints/desktop created
    +service/desktop created
    +service/memcached created
    +service/mongodb created
    +service/speedtest created
    +service/pyos created
    +service/console created
    +service/http-router created
    +service/website created
    +service/openldap created
    +
    +
    Verify Pods
    +

    Once the pods are created, all pods should be in Running status.
    +For the first time, please wait for downloading all container images. +It can take a while.

    +
    kubectl get pods -n abcdesktop
    +
    +

    You should read on the standard output

    +
    NAME                            READY   STATUS    RESTARTS   AGE
    +console-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s
    +memcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s
    +mongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s
    +nginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s
    +openldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s
    +pyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s
    +router-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s
    +speedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s
    +
    +

    Connect your local abcdesktop

    +

    Open your navigator to http://[your-ip-hostname]:30443/

    +

    abcdesktop homepage should be available :

    +

    abcdesktop Anonymous login

    +

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    +

    abcdesktop main screen login pending

    +

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    +

    abcdesktop main screen ready

    +

    Also, you can run again the command

    +
    kubectl get pods -l type=x11server -n abcdesktop
    +
    +

    You should see that the anonymous-XXXXX pod have been created and is Running

    +
    NAME              READY   STATUS    RESTARTS   AGE
    +anonymous-c44fc   4/4     Running   0          116s
    +
    +

    Great you have installed abcdesktop.io. +You just need a web browser to reach your web workspace. It' now time to add some container applications. +Read the next chapter to add applications

    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/3.5/setup/kubernetes_abcdesktop_applications/index.html b/3.5/setup/kubernetes_abcdesktop_applications/index.html new file mode 100644 index 000000000..78fbbc4ff --- /dev/null +++ b/3.5/setup/kubernetes_abcdesktop_applications/index.html @@ -0,0 +1,4300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Setup applications for abcdesktop - www.abcdesktop.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + + + +

    Setup applications for abcdesktop

    +

    Quick application install

    +
    +

    Quick installation can be run on Linux or macOS operation system.

    +
    +

    Download and execute the pullapps-3.5.sh script :

    +
    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.5.sh | bash
    +
    +

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    +
    NAME                                                             READY   STATUS              RESTARTS   AGE
    +daemonset-nginx-dqxzx                                            1/1     Running             0          100m
    +daemonset-pyos-rdwws                                             1/1     Running             0          100m
    +memcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m
    +mongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m
    +openldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m
    +pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s
    +pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s
    +pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s
    +pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s
    +pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s
    +pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s
    +pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s
    +speedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m
    +
    +

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    +
    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4
    +pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378
    +pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017
    +pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49
    +pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87
    +pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8
    +pod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met
    +pod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met
    +pod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met
    +pod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met
    +pod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met
    +pod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met
    +pod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met
    +
    +

    Quick application install (Windows)

    +
    +

    Quick installation can be run on Windows operation system.

    +
    +

    Download and execute the pullapps-3.5.ps1 script :

    +
    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.5.ps1 
    +
    +Invoke-Expression $($script.Content)
    +
    +

    Connect to your abcdesktop

    +

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    +

    Now reconnect to your abcdesktop.

    +

    Open your navigator to http://[your-ip-hostname]:30443/

    +
    http://localhost:30443/
    +
    +

    The new applications are installed, and ready to run.

    +

    applications after upload json

    +

    Mannualy install application

    +

    Add new application, require to send an application json document to the control-plane pyos.

    +

    Download a json application document format

    +

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    +
    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json
    +
    +

    To inspect image json you can also run crictl inspecti or docker inspect command.

    +
      +
    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • +
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json
    • +
    +

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    +

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    +

    Send the 2048.json file to the images REST endpoint

    +
    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json
    +
    +

    The response is the json document.

    +
    [{"home": null, "cmd": ["/composer/appli-docker-entrypoint.sh"], "workingdir": "/home/balloon", "user": "balloon", "sha_id": "sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd", "id": "abcdesktopio/2048.d:3.0", "rules": {"homedir": {"default": true}}, "acl": {"permit": ["all"]}, "launch": "2048-qt.2048-qt", "name": "2048", "icon": "circle_2048.svg", "icondata": "PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=", "keyword": "2048,2048", "uniquerunkey": null, "cat": "games", "args": null, "execmode": null, "security_opt": null, "showinview": null, "displayname": "2048", "mimetype": [], "path": "/usr/games/2048-qt", "desktopfile": "2048-qt.desktop", "executablefilename": "2048-qt", "usedefaultapplication": null, "fileextensions": [], "legacyfileextensions": [], "host_config": {"mem_limit": "256M", "shm_size": "64M", "pid_mode": false, "network_mode": "none"}, "secrets_requirement": null, "run_inside_pod": false, "image_pull_policy": "IfNotPresent", "image_pull_secrets": null
    +
    +

    REST API methods description for /API/manager/image

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodType
    GEThttp request list images in mongo db image collection
    PUThttp request update or insert images in mongo db image collection, then create a pull pod to fetch images
    POSThttp request update or insert images in mongo db image collection. This method does not pull images.
    DELETEhttp request delete images in mongo db image collection
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodSample
    GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image
    PUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
    POSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json
    DELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9
    +

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    +
    kubectl get pods -n abcdesktop
    +
    +

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    +
    NAME                                                             READY   STATUS    RESTARTS   AGE
    +daemonset-nginx-dqxzx                                            1/1     Running   0          32m
    +daemonset-pyos-rdwws                                             1/1     Running   0          32m
    +memcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m
    +mongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m
    +openldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m
    +pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s
    +speedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m
    +
    +

    Then the pod STATUS become Running during 42 seconds.

    +
    NAME                                                             READY   STATUS    RESTARTS   AGE
    +daemonset-nginx-dqxzx                                            1/1     Running   0          32m
    +daemonset-pyos-rdwws                                             1/1     Running   0          32m
    +memcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m
    +mongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m
    +openldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m
    +pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s
    +speedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m
    +
    +

    This pod is created to ask Kubernetes for pulling the container image.

    +

    Connect to your abcdesktop

    +

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    +

    Now reconnect to your abcdesktop.

    +

    Open your navigator to http://[your-ip-hostname]:30443/

    +
    http://localhost:30443/
    +
    +

    The new applications are installed, and ready to run.

    +

    applications after upload json

    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/3.5/setup/kubernetes_abcdesktop_windows/index.html b/3.5/setup/kubernetes_abcdesktop_windows/index.html new file mode 100644 index 000000000..63bcd4da0 --- /dev/null +++ b/3.5/setup/kubernetes_abcdesktop_windows/index.html @@ -0,0 +1,4213 @@ + + + + + + + + + + + + + + + + + + + + + Kubernetes abcdesktop windows - www.abcdesktop.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + + + + +

    Kubernetes abcdesktop windows

    + +

    Quick installation (Windows)

    +
    +

    Quick installation can be run on Windows operation system.

    +
    +

    Prerequisites

    +

    Install and configure Docker Desktop

    +

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    +

    Start Docker Desktop and wait for the docker engine to start.

    +

    starting docker desktop

    +

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    +

    enable kubernetes

    +

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    +
    kubectl version
    +client version: V1.40.4
    +Kustomise Version: V9-0-4-0.202506011699445602001590025
    +Server Version: v1.28.2
    +
    +

    check kubectl

    +

    Install OpenSSL

    +

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    +

    Download the OpenSSL v3.2.0 Light executable file.

    +

    dl openssl

    +

    Then follow the install process.

    +

    follow install step1

    +

    Make sure to keep in mind the path where OpenSSL will be installed.

    +

    follow install step2

    +

    Once installed, go to "Edit the system environement variables", and click on "Environement variables".

    +

    go to edit env variables

    +

    Go to the system variables section and search for Path

    +

    system variables

    +

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    +

    add env variable

    +

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    +
    openssl version
    +
    +

    check openssl

    +

    Run the install script

    +

    Download and extract the latest release automatically (Windows):

    +
    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1
    +
    +Invoke-Expression $($script.Content)
    +
    +

    You should read on stdout

    +
    [INFO] abcdesktop install script namespace=abcdesktop
    +[OK] kubectl version
    +[OK] openssl version
    +[OK] kubectl create namespace abcdesktop
    +writing RSA key
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_payload keys created
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_signing keys create
    +writing RSA key
    +[OK] abcdesktop_jwt_user_signing keys create
    +[OK] create secret generic abcdesktopjwtdesktoppayload
    +[OK] create secret generic abcdesktopjwtdesktopsigning
    +[OK] create secret generic abcdesktopjwtusersigning
    +[OK] label secret abcdesktopjwtdesktoppayload
    +[OK] label secret abcdesktopjwtdesktopsigning
    +[OK] label secret abcdesktopjwtusersigning
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3
    +[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop
    +[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config
    +role.rbac.authorization.k8s.io/pyos-role created
    +rolebinding.rbac.authorization.k8s.io/pyos-rbac created
    +serviceaccount/pyos-serviceaccount created
    +configmap/configmap-mongodb-scripts created
    +secret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created
    +deployment.apps/speedtest-od created
    +deployment.apps/pyos-od created
    +deployment.apps/console-od created
    +deployment.apps/openldap-od created
    +endpoints/desktop created
    +service/desktop created
    +service/memcached created
    +service/mongodb created
    +service/speedtest created
    +service/pyos created
    +service/console created
    +service/http-router created
    +service/website created
    +service/openldap created
    +[INFO] waiting for deployment/console-od available
    +[OK] deployment.apps/console-od condition met
    +[INFO] waiting for deployment/memcached-od available
    +[OK] deployment.apps/memcached-od condition met
    +[INFO] waiting for deployment/mongodb-od available
    +[OK] deployment.apps/mongodb-od condition met
    +[INFO] waiting for deployment/nginx-od available
    +[OK] deployment.apps/nginx-od condition met
    +[INFO] waiting for deployment/openldap-od available
    +[OK] deployment.apps/openldap-od condition met
    +[INFO] waiting for deployment/pyos-od available
    +[OK] deployment.apps/pyos-od condition met
    +[INFO] waiting for deployment/router-od available
    +[OK] deployment.apps/router-od condition met
    +[INFO] waiting for deployment/speedtest-od available
    +[OK] deployment.apps/speedtest-od condition met
    +[INFO] list all pods in namespace abcdesktop
    +NAME                            READY   STATUS    RESTARTS   AGE
    +console-od-844c749f85-pghrs     1/1     Running   0          12s
    +memcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s
    +mongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s
    +nginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s
    +openldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s
    +pyos-od-8d4988b56-7bg5z         1/1     Running   0          12s
    +router-od-f5458658-znwcg        1/1     Running   0          12s
    +speedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s
    +[INFO] Setup done
    +[INFO] Checking the service url on http://localhost:30443
    +[INFO] service status is down
    +[INFO] Looking for a free TCP port from 30443
    +[OK] Get a free TCP port from 30443
    +
    +[INFO] If you're using a cloud provider
    +[INFO] Forwarding abcdesktop service for you on port=30443
    +[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'
    +[OK] Port-Forward successful
    +[OK] Please open your web browser and connect to
    +
    +[INFO] http://localhost:30443/
    +
    +

    You can open a web browser and go to the http://localhost:30443/

    +

    Change the default namespace

    +

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    +
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1
    +
    +

    Run install-3.3.ps1

    +
    .\install-3.3.ps1 --namespace superdesktop
    +
    +

    You should read on stdout

    +
    [INFO] abcdesktop install script namespace=superdesktop
    +[OK] kubectl version
    +[OK] openssl version
    +[OK] kubectl create namespace superdesktop
    +writing RSA key
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_payload keys created
    +writing RSA key
    +[OK] abcdesktop_jwt_desktop_signing keys create
    +writing RSA key
    +[OK] abcdesktop_jwt_user_signing keys create
    +[OK] create secret generic abcdesktopjwtdesktoppayload
    +[OK] create secret generic abcdesktopjwtdesktopsigning
    +[OK] create secret generic abcdesktopjwtusersigning
    +[OK] label secret abcdesktopjwtdesktoppayload
    +[OK] label secret abcdesktopjwtdesktopsigning
    +[OK] label secret abcdesktopjwtusersigning
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml
    +[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3
    +[OK] updated abcdesktop.yaml file with new namespace superdesktop
    +[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local
    +[OK] updated od.config file with new namespace superdesktop
    +[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local
    +[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop
    +[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config
    +role.rbac.authorization.k8s.io/pyos-role created
    +rolebinding.rbac.authorization.k8s.io/pyos-rbac created
    +serviceaccount/pyos-serviceaccount created
    +configmap/configmap-mongodb-scripts created
    +secret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created
    +deployment.apps/speedtest-od created
    +deployment.apps/pyos-od created
    +deployment.apps/console-od created
    +deployment.apps/openldap-od created
    +endpoints/desktop created
    +service/desktop created
    +service/memcached created
    +service/mongodb created
    +service/speedtest created
    +service/pyos created
    +service/console created
    +service/http-router created
    +service/website created
    +service/openldap created
    +[INFO] waiting for deployment/console-od available
    +[OK] deployment.apps/console-od condition met
    +[INFO] waiting for deployment/memcached-od available
    +[OK] deployment.apps/memcached-od condition met
    +[INFO] waiting for deployment/mongodb-od available
    +[OK] deployment.apps/mongodb-od condition met
    +[INFO] waiting for deployment/nginx-od available
    +[OK] deployment.apps/nginx-od condition met
    +[INFO] waiting for deployment/openldap-od available
    +[OK] deployment.apps/openldap-od condition met
    +[INFO] waiting for deployment/pyos-od available
    +[OK] deployment.apps/pyos-od condition met
    +[INFO] waiting for deployment/router-od available
    +[OK] deployment.apps/router-od condition met
    +[INFO] waiting for deployment/speedtest-od available
    +[OK] deployment.apps/speedtest-od condition met
    +[INFO] list all pods in namespace superdesktop
    +NAME                            READY   STATUS    RESTARTS   AGE
    +console-od-844c749f85-zqbdq     1/1     Running   0          22s
    +memcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s
    +mongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s
    +nginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s
    +openldap-od-6955699d5-rl8rd     1/1     Running   0          21s
    +pyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s
    +router-od-c9fd4c987-xvcbq       1/1     Running   0          22s
    +speedtest-od-67db77f86f-6fftb   1/1     Running   0          22s
    +[INFO] Setup done
    +[INFO] Checking the service url on http://localhost:30443
    +[INFO] service status is down
    +[INFO] Looking for a free TCP port from 30443
    +[OK] Get a free TCP port from 30443
    +
    +[INFO] If you're using a cloud provider
    +[INFO] Forwarding abcdesktop service for you on port=30443
    +[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'
    +[OK] Port-Forward successful
    +[OK] Please open your web browser and connect to
    +
    +[INFO] http://localhost:30443/
    +
    +

    You can open a web browser and go to the http://localhost:30443/

    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/3.5/setup/uninstall_kubernetes/index.html b/3.5/setup/uninstall_kubernetes/index.html new file mode 100644 index 000000000..b995502df --- /dev/null +++ b/3.5/setup/uninstall_kubernetes/index.html @@ -0,0 +1,4129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Uninstall abcdesktop - www.abcdesktop.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + + + +

    Uninstall abcdesktop for kubernetes

    +

    Command to uninstall abcdesktop release 3.5

    +

    To uninstall abcdesktop. Choose run run the uninstall-3.5.sh bash script using a curl.

    +

    Quick uninstallation abcdesktop (Windows)

    +

    If you are using a Windows operating system please click on the link below
    +Quick uninstall for windows

    +

    Quick uninstallation abcdesktop (Linux or macOS)

    +
    +

    Quick uninstallation can be run on Linux or macOS operation system.

    +
    +

    Download and extract the uninstall bash script (Linux or macOS):

    +
    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.5.sh | bash
    +
    +

    You should read on stdout

    +
    abcdesktop uninstall script namespace=abcdesktop
    +[OK] kubectl version
    +[OK] kubectl get namespace abcdesktop
    +[OK] delete pods --selector="type=x11server" -n abcdesktop
    +[OK] use local file abcdesktop.yaml
    +role.rbac.authorization.k8s.io "pyos-role" deleted
    +rolebinding.rbac.authorization.k8s.io "pyos-rbac" deleted
    +serviceaccount "pyos-serviceaccount" deleted
    +configmap "configmap-mongodb-scripts" deleted
    +secret "secret-mongodb" deleted
    +deployment.apps "mongodb-od" deleted
    +deployment.apps "memcached-od" deleted
    +deployment.apps "router-od" deleted
    +deployment.apps "nginx-od" deleted
    +deployment.apps "speedtest-od" deleted
    +deployment.apps "pyos-od" deleted
    +deployment.apps "console-od" deleted
    +deployment.apps "openldap-od" deleted
    +endpoints "desktop" deleted
    +service "desktop" deleted
    +service "memcached" deleted
    +service "mongodb" deleted
    +service "speedtest" deleted
    +service "pyos" deleted
    +service "console" deleted
    +service "http-router" deleted
    +service "website" deleted
    +service "openldap" deleted
    +[OK] kubectl delete -f abcdesktop.yaml
    +[OK] kubectl delete secrets --all -n abcdesktop
    +[OK] kubectl delete configmap --all -n abcdesktop
    +[OK] kubectl delete pvc --all -n abcdesktop
    +[INFO] deleting namespace abcdesktop
    +[OK] namespace "abcdesktop" deleted
    +
    +

    Please wait for the output message:

    +
    [OK] namespace "abcdesktop" deleted
    +
    +

    Great, you have uninstalled abcdesktop for kubernetes.

    +

    uninstall with a dedicated namespace

    +
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.5.sh
    +chmod 755 uninstall-3.5.sh
    +
    +

    Run the uninstall-3.5.sh command line with your own namespace

    +
    ./uninstall-3.5.sh --namespace superdesktop
    +
    +

    You should read on stdout

    +
    abcdesktop uninstall script namespace=superdesktop
    +[OK] kubectl version
    +[OK] kubectl get namespace superdesktop
    +[OK] delete pods --selector="type=x11server" -n superdesktop
    +[OK] use local file abcdesktop.yaml
    +role.rbac.authorization.k8s.io "pyos-role" deleted
    +rolebinding.rbac.authorization.k8s.io "pyos-rbac" deleted
    +serviceaccount "pyos-serviceaccount" deleted
    +configmap "configmap-mongodb-scripts" deleted
    +secret "secret-mongodb" deleted
    +deployment.apps "mongodb-od" deleted
    +deployment.apps "memcached-od" deleted
    +deployment.apps "router-od" deleted
    +deployment.apps "nginx-od" deleted
    +deployment.apps "speedtest-od" deleted
    +deployment.apps "pyos-od" deleted
    +deployment.apps "console-od" deleted
    +deployment.apps "openldap-od" deleted
    +endpoints "desktop" deleted
    +service "desktop" deleted
    +service "memcached" deleted
    +service "mongodb" deleted
    +service "speedtest" deleted
    +service "pyos" deleted
    +service "console" deleted
    +service "http-router" deleted
    +service "website" deleted
    +service "openldap" deleted
    +[OK] kubectl delete -f abcdesktop.yaml
    +[OK] kubectl delete secrets --all -n superdesktop
    +[OK] kubectl delete configmap --all -n superdesktop
    +[OK] kubectl delete pvc --all -n superdesktop
    +[INFO] deleting namespace superdesktop
    +[OK] namespace "superdesktop" deleted
    +
    +

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/3.5/setup/uninstall_kubernetes_windows/index.html b/3.5/setup/uninstall_kubernetes_windows/index.html new file mode 100644 index 000000000..040798208 --- /dev/null +++ b/3.5/setup/uninstall_kubernetes_windows/index.html @@ -0,0 +1,4044 @@ + + + + + + + + + + + + + + + + + + + + + Uninstall kubernetes windows - www.abcdesktop.io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + + + + +

    Uninstall kubernetes windows

    + +

    Quick uninstallation abcdesktop (Windows)

    +
    +

    Quick uninstallation can be run on Windows operation system.

    +
    +

    Download and extract the uninstall PowerShell script (Windows):

    +
    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 
    +
    +Invoke-Expression $($script.Content)
    +
    +

    You should read on stdout

    +
    [INFO] abcdesktop uninstall script namespace=abcdesktop
    +[OK] kubectl version
    +[OK] kubectl get namespace abcdesktop
    +[OK] delete pods --selector=\
    +[OK] use local file abcdesktop.yaml
    +role.rbac.authorization.k8s.io "pyos-role" deleted
    +rolebinding.rbac.authorization.k8s.io "pyos-rbac" deleted
    +serviceaccount "pyos-serviceaccount" deleted
    +configmap "configmap-mongodb-scripts" deleted
    +secret "secret-mongodb" deleted
    +deployment.apps "mongodb-od" deleted
    +deployment.apps "memcached-od" deleted
    +deployment.apps "router-od" deleted
    +deployment.apps "nginx-od" deleted
    +deployment.apps "speedtest-od" deleted
    +deployment.apps "pyos-od" deleted
    +deployment.apps "console-od" deleted
    +deployment.apps "openldap-od" deleted
    +endpoints "desktop" deleted
    +service "desktop" deleted
    +service "memcached" deleted
    +service "mongodb" deleted
    +service "speedtest" deleted
    +service "pyos" deleted
    +service "console" deleted
    +service "http-router" deleted
    +service "website" deleted
    +service "openldap" deleted
    +[OK] kubectl delete -f abcdesktop.yaml
    +[OK] kubectl delete secrets --all -n abcdesktop
    +[OK] kubectl delete configmap --all -n abcdesktop
    +[OK] kubectl delete pvc --all -n abcdesktop
    +[INFO] deleting namespace abcdesktop
    +[OK] namespace "abcdesktop" deleted
    +[INFO] delete abcdesktop related files
    +[OK] remove od.config abcdesktop.yaml poduser.yaml
    +[OK] remove *.pem
    +[INFO] abcdesktop was succesfully uninstalled
    +
    +

    Uninstall with a dedicated namespace

    +
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1
    +
    +

    Run the uninstall-3.3.ps1 command line with your own namespace

    +
    .\uninstall-3.3.ps1 --namespace superdesktop
    +
    +

    You should read on stdout

    +
    [INFO] abcdesktop uninstall script namespace=superdesktop
    +[OK] kubectl version
    +[OK] kubectl get namespace superdesktop
    +[OK] delete pods --selector=\
    +[OK] use local file abcdesktop.yaml
    +[OK] updated abcdesktop.yaml file with new namespace superdesktop
    +role.rbac.authorization.k8s.io "pyos-role" deleted
    +rolebinding.rbac.authorization.k8s.io "pyos-rbac" deleted
    +serviceaccount "pyos-serviceaccount" deleted
    +configmap "configmap-mongodb-scripts" deleted
    +secret "secret-mongodb" deleted
    +deployment.apps "mongodb-od" deleted
    +deployment.apps "memcached-od" deleted
    +deployment.apps "router-od" deleted
    +deployment.apps "nginx-od" deleted
    +deployment.apps "speedtest-od" deleted
    +deployment.apps "pyos-od" deleted
    +deployment.apps "console-od" deleted
    +deployment.apps "openldap-od" deleted
    +endpoints "desktop" deleted
    +service "desktop" deleted
    +service "memcached" deleted
    +service "mongodb" deleted
    +service "speedtest" deleted
    +service "pyos" deleted
    +service "console" deleted
    +service "http-router" deleted
    +service "website" deleted
    +service "openldap" deleted
    +[OK] kubectl delete -f abcdesktop.yaml
    +[OK] kubectl delete secrets --all -n superdesktop
    +[OK] kubectl delete configmap --all -n superdesktop
    +[OK] kubectl delete pvc --all -n superdesktop
    +[INFO] deleting namespace superdesktop
    +[OK] namespace "superdesktop" deleted
    +[INFO] delete abcdesktop related files
    +[OK] remove od.config abcdesktop.yaml poduser.yaml
    +[OK] remove *.pem
    +[INFO] abcdesktop was succesfully uninstalled
    +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/404.html b/404.html index 71fd272b2..0e7cbcb45 100644 --- a/404.html +++ b/404.html @@ -1715,6 +1715,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/authors/index.html b/about/authors/index.html index 5ca4e6f96..277764fc3 100644 --- a/about/authors/index.html +++ b/about/authors/index.html @@ -1786,6 +1786,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/gnu-gpl-v2.0/index.html b/about/gnu-gpl-v2.0/index.html index e7404b5ce..dc7dde95d 100644 --- a/about/gnu-gpl-v2.0/index.html +++ b/about/gnu-gpl-v2.0/index.html @@ -1804,6 +1804,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/howreadthisdoc/index.html b/about/howreadthisdoc/index.html index a138c41cc..514f9293f 100644 --- a/about/howreadthisdoc/index.html +++ b/about/howreadthisdoc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/howtodolabsexercices/index.html b/about/howtodolabsexercices/index.html index e24ad6a1f..36cdcaf59 100644 --- a/about/howtodolabsexercices/index.html +++ b/about/howtodolabsexercices/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/opensource/index.html b/about/opensource/index.html index 494a4878a..d1beb6ac6 100644 --- a/about/opensource/index.html +++ b/about/opensource/index.html @@ -1916,6 +1916,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/otherrelatedprojects/index.html b/about/otherrelatedprojects/index.html index 4c86612a3..81ef4061b 100644 --- a/about/otherrelatedprojects/index.html +++ b/about/otherrelatedprojects/index.html @@ -1777,6 +1777,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/play_sound_in_docker/index.html b/about/play_sound_in_docker/index.html index e3ae7d51d..a7cf4fd14 100644 --- a/about/play_sound_in_docker/index.html +++ b/about/play_sound_in_docker/index.html @@ -1810,6 +1810,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/about/version/index.html b/about/version/index.html index 9f991dc1b..80c076f23 100644 --- a/about/version/index.html +++ b/about/version/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/adopters/index.html b/adopters/index.html index f802793da..708a4a454 100644 --- a/adopters/index.html +++ b/adopters/index.html @@ -1736,6 +1736,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/api/backend/launchdesktop/index.html b/api/backend/launchdesktop/index.html index c76e9b330..39319366b 100644 --- a/api/backend/launchdesktop/index.html +++ b/api/backend/launchdesktop/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/2048-alpine-error/index.html b/applications/2048-alpine-error/index.html index 6360ff68e..7a077240c 100644 --- a/applications/2048-alpine-error/index.html +++ b/applications/2048-alpine-error/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/2048-alpine/index.html b/applications/2048-alpine/index.html index 0a88e49c1..d3d521718 100644 --- a/applications/2048-alpine/index.html +++ b/applications/2048-alpine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/2048-ubuntu/index.html b/applications/2048-ubuntu/index.html index 9f9cb4102..fd0aeb2d1 100644 --- a/applications/2048-ubuntu/index.html +++ b/applications/2048-ubuntu/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/2048/index.html b/applications/2048/index.html index d7b8c5ced..eac9452ab 100644 --- a/applications/2048/index.html +++ b/applications/2048/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.3.17/index.html b/applications/abcdesktopio/oc.template.alpine.3.17/index.html index f81066c28..33cb3c089 100644 --- a/applications/abcdesktopio/oc.template.alpine.3.17/index.html +++ b/applications/abcdesktopio/oc.template.alpine.3.17/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.3.18/index.html b/applications/abcdesktopio/oc.template.alpine.3.18/index.html index 1ff265722..7ca3eb7c7 100644 --- a/applications/abcdesktopio/oc.template.alpine.3.18/index.html +++ b/applications/abcdesktopio/oc.template.alpine.3.18/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/index.html b/applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/index.html index 3d88a7801..4dee7fc76 100644 --- a/applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/index.html +++ b/applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.edge.gtk/index.html b/applications/abcdesktopio/oc.template.alpine.edge.gtk/index.html index edc372847..6da4dbbf4 100644 --- a/applications/abcdesktopio/oc.template.alpine.edge.gtk/index.html +++ b/applications/abcdesktopio/oc.template.alpine.edge.gtk/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.edge/index.html b/applications/abcdesktopio/oc.template.alpine.edge/index.html index 18abdfdca..855a28c99 100644 --- a/applications/abcdesktopio/oc.template.alpine.edge/index.html +++ b/applications/abcdesktopio/oc.template.alpine.edge/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.gtk/index.html b/applications/abcdesktopio/oc.template.alpine.gtk/index.html index 7f33a266c..671770200 100644 --- a/applications/abcdesktopio/oc.template.alpine.gtk/index.html +++ b/applications/abcdesktopio/oc.template.alpine.gtk/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.libreoffice/index.html b/applications/abcdesktopio/oc.template.alpine.libreoffice/index.html index d7190f577..1eee6960c 100644 --- a/applications/abcdesktopio/oc.template.alpine.libreoffice/index.html +++ b/applications/abcdesktopio/oc.template.alpine.libreoffice/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal.3.17/index.html b/applications/abcdesktopio/oc.template.alpine.minimal.3.17/index.html index 28198616d..88696f801 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal.3.17/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal.3.17/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal.3.18/index.html b/applications/abcdesktopio/oc.template.alpine.minimal.3.18/index.html index c35663c23..dcca29267 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal.3.18/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal.3.18/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal.3.19/index.html b/applications/abcdesktopio/oc.template.alpine.minimal.3.19/index.html index 77b44d080..5daff8ceb 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal.3.19/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal.3.19/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal.3.20/index.html b/applications/abcdesktopio/oc.template.alpine.minimal.3.20/index.html index 914ae27ca..b1bf63ce4 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal.3.20/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal.3.20/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal.edge/index.html b/applications/abcdesktopio/oc.template.alpine.minimal.edge/index.html index e9ba6ff21..1a95e1e6a 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal.edge/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal.edge/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.minimal/index.html b/applications/abcdesktopio/oc.template.alpine.minimal/index.html index d4d5e00da..889314441 100644 --- a/applications/abcdesktopio/oc.template.alpine.minimal/index.html +++ b/applications/abcdesktopio/oc.template.alpine.minimal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine.wine/index.html b/applications/abcdesktopio/oc.template.alpine.wine/index.html index 13db904ae..da72b8e6c 100644 --- a/applications/abcdesktopio/oc.template.alpine.wine/index.html +++ b/applications/abcdesktopio/oc.template.alpine.wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.alpine/index.html b/applications/abcdesktopio/oc.template.alpine/index.html index 35d093f8b..d46d2de95 100644 --- a/applications/abcdesktopio/oc.template.alpine/index.html +++ b/applications/abcdesktopio/oc.template.alpine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.debian.gtk/index.html b/applications/abcdesktopio/oc.template.debian.gtk/index.html index 79202b889..9290412ae 100644 --- a/applications/abcdesktopio/oc.template.debian.gtk/index.html +++ b/applications/abcdesktopio/oc.template.debian.gtk/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.debian.minimal/index.html b/applications/abcdesktopio/oc.template.debian.minimal/index.html index 4c263ff44..78667b74c 100644 --- a/applications/abcdesktopio/oc.template.debian.minimal/index.html +++ b/applications/abcdesktopio/oc.template.debian.minimal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.debian/index.html b/applications/abcdesktopio/oc.template.debian/index.html index 9e56c740d..c5d41c60c 100644 --- a/applications/abcdesktopio/oc.template.debian/index.html +++ b/applications/abcdesktopio/oc.template.debian/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.8/index.html b/applications/abcdesktopio/oc.template.rockylinux.8/index.html index e7c57fb7d..0c565f21f 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.8/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.8/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.9/index.html b/applications/abcdesktopio/oc.template.rockylinux.9/index.html index 35e907eb5..0f6297482 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.9/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.9/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.gtk.8/index.html b/applications/abcdesktopio/oc.template.rockylinux.gtk.8/index.html index e191f21cf..cb1be68ad 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.gtk.8/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.gtk.8/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.gtk.9/index.html b/applications/abcdesktopio/oc.template.rockylinux.gtk.9/index.html index 2f91ed11d..1d5151cc6 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.gtk.9/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.gtk.9/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/index.html b/applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/index.html index d43f3845f..752b3d0d1 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.minimal.8/index.html b/applications/abcdesktopio/oc.template.rockylinux.minimal.8/index.html index c03a667b9..7af7b18cb 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.minimal.8/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.minimal.8/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.minimal.9/index.html b/applications/abcdesktopio/oc.template.rockylinux.minimal.9/index.html index ae2c72117..a41b942b8 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.minimal.9/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.minimal.9/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.nvidia.8/index.html b/applications/abcdesktopio/oc.template.rockylinux.nvidia.8/index.html index d65b1ab16..bc87c6c67 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.nvidia.8/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.nvidia.8/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.rockylinux.nvidia.9/index.html b/applications/abcdesktopio/oc.template.rockylinux.nvidia.9/index.html index 10b06bdba..a0fea031a 100644 --- a/applications/abcdesktopio/oc.template.rockylinux.nvidia.9/index.html +++ b/applications/abcdesktopio/oc.template.rockylinux.nvidia.9/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.18.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.18.04/index.html index 2afc7abe6..4f8a8e4a7 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.18.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.18.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.20.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.20.04/index.html index 84a54b332..a5aef6dfd 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.20.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.20.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.22.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.22.04/index.html index bdd87f27c..6951ac4e8 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.22.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.22.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.24.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.24.04/index.html index 4e31c0e98..8b7dc7668 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.24.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.24.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/index.html index 29bedc57f..4fff2e8f3 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/index.html index b8fdf188d..2efcbe385 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/index.html index ab929cc50..db752733f 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/index.html index ed6ed0efe..159a86b4a 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.java/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.java/index.html index 020647528..e3732a043 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.java/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.java/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/index.html index 43a6eb130..de33df2c6 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/index.html index 8a86ad294..602872e39 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.gtk/index.html b/applications/abcdesktopio/oc.template.ubuntu.gtk/index.html index a67f72ce5..670377249 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.gtk/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.gtk/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/index.html index c5fce3510..8cb77c5d2 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/index.html index f2eab502b..b6ab670a8 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/index.html index f90cad2cc..ae60e0d1b 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/index.html index 6c35166f1..d3b4d3703 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/index.html index 93569e4c0..ca81ca812 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/index.html b/applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/index.html index 1f29b6fcc..d5b7ad96d 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/index.html b/applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/index.html index 58d259f43..f7c037803 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/abcdesktopio/oc.template.ubuntu.wine/index.html b/applications/abcdesktopio/oc.template.ubuntu.wine/index.html index d55814657..0e20e9086 100644 --- a/applications/abcdesktopio/oc.template.ubuntu.wine/index.html +++ b/applications/abcdesktopio/oc.template.ubuntu.wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/apachedirectorystudio/index.html b/applications/apachedirectorystudio/index.html index fffbd282d..22f27b2ae 100644 --- a/applications/apachedirectorystudio/index.html +++ b/applications/apachedirectorystudio/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/astromenace/index.html b/applications/astromenace/index.html index f3921e52f..b4ecc326b 100644 --- a/applications/astromenace/index.html +++ b/applications/astromenace/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/atom/index.html b/applications/atom/index.html index 63c75efe5..64ee84cfc 100644 --- a/applications/atom/index.html +++ b/applications/atom/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/base/index.html b/applications/base/index.html index 13dff86b5..a108db015 100644 --- a/applications/base/index.html +++ b/applications/base/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/beekeeperstudio/index.html b/applications/beekeeperstudio/index.html index 0c1c0425e..7d13ad2f2 100644 --- a/applications/beekeeperstudio/index.html +++ b/applications/beekeeperstudio/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/blender/index.html b/applications/blender/index.html index 3ba7cb748..ec9a11602 100644 --- a/applications/blender/index.html +++ b/applications/blender/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/bless/index.html b/applications/bless/index.html index 66948deab..fcc5af7a8 100644 --- a/applications/bless/index.html +++ b/applications/bless/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/blobby/index.html b/applications/blobby/index.html index 7ecb8e37f..8edabff8a 100644 --- a/applications/blobby/index.html +++ b/applications/blobby/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/boxes/index.html b/applications/boxes/index.html index f4e1dd3a9..9438a0d5e 100644 --- a/applications/boxes/index.html +++ b/applications/boxes/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/brackets/index.html b/applications/brackets/index.html index 0bb32de5d..acfc53f53 100644 --- a/applications/brackets/index.html +++ b/applications/brackets/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/calc/index.html b/applications/calc/index.html index b13fecbd4..9592525a5 100644 --- a/applications/calc/index.html +++ b/applications/calc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/calculator/index.html b/applications/calculator/index.html index 43229082d..ed4f86282 100644 --- a/applications/calculator/index.html +++ b/applications/calculator/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/chess/index.html b/applications/chess/index.html index 0d1c549d0..6b24442ce 100644 --- a/applications/chess/index.html +++ b/applications/chess/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/chrome/index.html b/applications/chrome/index.html index 3954a12f3..461304b25 100644 --- a/applications/chrome/index.html +++ b/applications/chrome/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/chromium/index.html b/applications/chromium/index.html index a8b0825fd..9fba7e16f 100644 --- a/applications/chromium/index.html +++ b/applications/chromium/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/citrix/index.html b/applications/citrix/index.html index d9f8d829f..636c37943 100644 --- a/applications/citrix/index.html +++ b/applications/citrix/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cloudfoundry/index.html b/applications/cloudfoundry/index.html index 5937ce6e0..8d1546fb8 100644 --- a/applications/cloudfoundry/index.html +++ b/applications/cloudfoundry/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cmd.exe/index.html b/applications/cmd.exe/index.html index c81b55f2b..9c5bb8c46 100644 --- a/applications/cmd.exe/index.html +++ b/applications/cmd.exe/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cntlm/index.html b/applications/cntlm/index.html index fdfff079d..f6fed6ea3 100644 --- a/applications/cntlm/index.html +++ b/applications/cntlm/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/corsix-th/index.html b/applications/corsix-th/index.html index cacda934d..55cb66a00 100644 --- a/applications/corsix-th/index.html +++ b/applications/corsix-th/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cuda/index.html b/applications/cuda/index.html index ff8b4804c..9f8cb7b14 100644 --- a/applications/cuda/index.html +++ b/applications/cuda/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cudademo/index.html b/applications/cudademo/index.html index 689a73594..0ff2baca4 100644 --- a/applications/cudademo/index.html +++ b/applications/cudademo/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/cudadev/index.html b/applications/cudadev/index.html index 7cb9d5d41..e23c2869f 100644 --- a/applications/cudadev/index.html +++ b/applications/cudadev/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/dia/index.html b/applications/dia/index.html index 4822a0680..bba263214 100644 --- a/applications/dia/index.html +++ b/applications/dia/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/doom/index.html b/applications/doom/index.html index a207fe496..3bb6a4fab 100644 --- a/applications/doom/index.html +++ b/applications/doom/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/draw/index.html b/applications/draw/index.html index 8dc132c2a..4fe27f021 100644 --- a/applications/draw/index.html +++ b/applications/draw/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/drawio/index.html b/applications/drawio/index.html index 04c9c9c12..51537c452 100644 --- a/applications/drawio/index.html +++ b/applications/drawio/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/dummy/index.html b/applications/dummy/index.html index 286f03efa..d60d2f0e8 100644 --- a/applications/dummy/index.html +++ b/applications/dummy/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/eclipse/index.html b/applications/eclipse/index.html index cf8886564..9e7dd9639 100644 --- a/applications/eclipse/index.html +++ b/applications/eclipse/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/eclipse_sts4/index.html b/applications/eclipse_sts4/index.html index 3bf259a37..21863312c 100644 --- a/applications/eclipse_sts4/index.html +++ b/applications/eclipse_sts4/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/edge/index.html b/applications/edge/index.html index 93ac2579b..89ac69cec 100644 --- a/applications/edge/index.html +++ b/applications/edge/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/elementary.terminal/index.html b/applications/elementary.terminal/index.html index 52550ee52..54206c450 100644 --- a/applications/elementary.terminal/index.html +++ b/applications/elementary.terminal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/eog/index.html b/applications/eog/index.html index 778c1391f..955dbe67a 100644 --- a/applications/eog/index.html +++ b/applications/eog/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/evince/index.html b/applications/evince/index.html index 93da2979e..59ad08d6e 100644 --- a/applications/evince/index.html +++ b/applications/evince/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/evolution/index.html b/applications/evolution/index.html index 69b58556b..1f1aa24a3 100644 --- a/applications/evolution/index.html +++ b/applications/evolution/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/file-roller/index.html b/applications/file-roller/index.html index a1af2a65b..7947d64a5 100644 --- a/applications/file-roller/index.html +++ b/applications/file-roller/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/filelight/index.html b/applications/filelight/index.html index 289bb3a77..9d9a84b34 100644 --- a/applications/filelight/index.html +++ b/applications/filelight/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/filezilla/index.html b/applications/filezilla/index.html index 7736d87ff..1cd82253b 100644 --- a/applications/filezilla/index.html +++ b/applications/filezilla/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/firefox-esr/index.html b/applications/firefox-esr/index.html index cc3455eca..891aa7c28 100644 --- a/applications/firefox-esr/index.html +++ b/applications/firefox-esr/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/firefox/index.html b/applications/firefox/index.html index 778cce3b0..9d5861189 100644 --- a/applications/firefox/index.html +++ b/applications/firefox/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/firefoxrest/index.html b/applications/firefoxrest/index.html index 7cdeef2e6..4c95b488e 100644 --- a/applications/firefoxrest/index.html +++ b/applications/firefoxrest/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/flare/index.html b/applications/flare/index.html index ee53dffe7..2e5c8fade 100644 --- a/applications/flare/index.html +++ b/applications/flare/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/frozen-bubble/index.html b/applications/frozen-bubble/index.html index ea2a55a0f..55dcb8003 100644 --- a/applications/frozen-bubble/index.html +++ b/applications/frozen-bubble/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gcompris/index.html b/applications/gcompris/index.html index 34f0f0b8f..40a48d15b 100644 --- a/applications/gcompris/index.html +++ b/applications/gcompris/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/geany/index.html b/applications/geany/index.html index 9759ce887..7ed8a9ab4 100644 --- a/applications/geany/index.html +++ b/applications/geany/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gedit/index.html b/applications/gedit/index.html index 8ae32190d..5327195ad 100644 --- a/applications/gedit/index.html +++ b/applications/gedit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gelemental/index.html b/applications/gelemental/index.html index cb31be37d..fee32ac5e 100644 --- a/applications/gelemental/index.html +++ b/applications/gelemental/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/geogebra/index.html b/applications/geogebra/index.html index 83579dc05..2d5cf73e1 100644 --- a/applications/geogebra/index.html +++ b/applications/geogebra/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gephi/index.html b/applications/gephi/index.html index fdca7b9f5..2d7327b6c 100644 --- a/applications/gephi/index.html +++ b/applications/gephi/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gimagereader/index.html b/applications/gimagereader/index.html index 1993e4c8f..05bc9b42d 100644 --- a/applications/gimagereader/index.html +++ b/applications/gimagereader/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gimp/index.html b/applications/gimp/index.html index 2f7e5350d..40c5ab949 100644 --- a/applications/gimp/index.html +++ b/applications/gimp/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gnumeric/index.html b/applications/gnumeric/index.html index 082562701..a49468ca3 100644 --- a/applications/gnumeric/index.html +++ b/applications/gnumeric/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/golly/index.html b/applications/golly/index.html index e1902e1d7..7df7464da 100644 --- a/applications/golly/index.html +++ b/applications/golly/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/gretl/index.html b/applications/gretl/index.html index 4a3f97971..28fa941c6 100644 --- a/applications/gretl/index.html +++ b/applications/gretl/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/hyper/index.html b/applications/hyper/index.html index c8a6acc13..48a7418ad 100644 --- a/applications/hyper/index.html +++ b/applications/hyper/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/impress/index.html b/applications/impress/index.html index a7c953f70..fed2d1ee1 100644 --- a/applications/impress/index.html +++ b/applications/impress/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/index.html b/applications/index.html index 9fdaa5f89..9858368ec 100644 --- a/applications/index.html +++ b/applications/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/inkscape/index.html b/applications/inkscape/index.html index 379365692..9b1ea3d3c 100644 --- a/applications/inkscape/index.html +++ b/applications/inkscape/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/jupyter/index.html b/applications/jupyter/index.html index bb198dbc0..130f0b082 100644 --- a/applications/jupyter/index.html +++ b/applications/jupyter/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/jupyternvidia/index.html b/applications/jupyternvidia/index.html index 2a9841b9c..6434f5c4a 100644 --- a/applications/jupyternvidia/index.html +++ b/applications/jupyternvidia/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/kalzium/index.html b/applications/kalzium/index.html index 7a4b7ca5c..f4fb930a0 100644 --- a/applications/kalzium/index.html +++ b/applications/kalzium/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/kdiamond/index.html b/applications/kdiamond/index.html index 291fc2857..313a18cc0 100644 --- a/applications/kdiamond/index.html +++ b/applications/kdiamond/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/kgeography/index.html b/applications/kgeography/index.html index 9449b7cf4..fdf3034f1 100644 --- a/applications/kgeography/index.html +++ b/applications/kgeography/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/kigo/index.html b/applications/kigo/index.html index 742294407..94a639441 100644 --- a/applications/kigo/index.html +++ b/applications/kigo/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/klickety/index.html b/applications/klickety/index.html index 433540976..9c41cd7da 100644 --- a/applications/klickety/index.html +++ b/applications/klickety/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/klotski/index.html b/applications/klotski/index.html index d8573393d..68ff4f2fc 100644 --- a/applications/klotski/index.html +++ b/applications/klotski/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/konsole/index.html b/applications/konsole/index.html index 7b5bf54b6..422b04d6b 100644 --- a/applications/konsole/index.html +++ b/applications/konsole/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/ksquares/index.html b/applications/ksquares/index.html index 7e00dc9d2..8eb83ed80 100644 --- a/applications/ksquares/index.html +++ b/applications/ksquares/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/kturtle/index.html b/applications/kturtle/index.html index 046093b07..d14e31b7b 100644 --- a/applications/kturtle/index.html +++ b/applications/kturtle/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/leocad/index.html b/applications/leocad/index.html index bf7075cef..414ec9118 100644 --- a/applications/leocad/index.html +++ b/applications/leocad/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/librecad/index.html b/applications/librecad/index.html index 2b9b04b7e..7f376d16a 100644 --- a/applications/librecad/index.html +++ b/applications/librecad/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/list/index.html b/applications/list/index.html index 0dc504243..8ed6b3c1c 100644 --- a/applications/list/index.html +++ b/applications/list/index.html @@ -11,7 +11,7 @@ - + @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/mahjongg/index.html b/applications/mahjongg/index.html index 632f74e3e..ca3ebf75f 100644 --- a/applications/mahjongg/index.html +++ b/applications/mahjongg/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/maps/index.html b/applications/maps/index.html index ea2106c42..8e9bf2aa2 100644 --- a/applications/maps/index.html +++ b/applications/maps/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/math/index.html b/applications/math/index.html index 6da064ac6..e5cb54078 100644 --- a/applications/math/index.html +++ b/applications/math/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/mathwar/index.html b/applications/mathwar/index.html index 76250c065..ab3cd15c8 100644 --- a/applications/mathwar/index.html +++ b/applications/mathwar/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/minecraft/index.html b/applications/minecraft/index.html index 7ee20f1fb..51cbd866f 100644 --- a/applications/minecraft/index.html +++ b/applications/minecraft/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/mines/index.html b/applications/mines/index.html index 827b51c7c..5a05ea568 100644 --- a/applications/mines/index.html +++ b/applications/mines/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/nautilus/index.html b/applications/nautilus/index.html index ed60ba926..719a7b3bd 100644 --- a/applications/nautilus/index.html +++ b/applications/nautilus/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/netbeans/index.html b/applications/netbeans/index.html index 90e2cb9c5..fba1a8fe6 100644 --- a/applications/netbeans/index.html +++ b/applications/netbeans/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/notepad-wine/index.html b/applications/notepad-wine/index.html index cc235642a..6f0798397 100644 --- a/applications/notepad-wine/index.html +++ b/applications/notepad-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/notepadqq/index.html b/applications/notepadqq/index.html index a16f2d39b..902288077 100644 --- a/applications/notepadqq/index.html +++ b/applications/notepadqq/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/octave/index.html b/applications/octave/index.html index 22ad330ff..108a686fa 100644 --- a/applications/octave/index.html +++ b/applications/octave/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/onlyoffice/index.html b/applications/onlyoffice/index.html index bc7e3bdd4..fb0574f77 100644 --- a/applications/onlyoffice/index.html +++ b/applications/onlyoffice/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/openshift/index.html b/applications/openshift/index.html index b52960279..ceecc1355 100644 --- a/applications/openshift/index.html +++ b/applications/openshift/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/pinta/index.html b/applications/pinta/index.html index 3df49444b..7b423de45 100644 --- a/applications/pinta/index.html +++ b/applications/pinta/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/planner/index.html b/applications/planner/index.html index 154cbdd9b..65d0aa80c 100644 --- a/applications/planner/index.html +++ b/applications/planner/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/postman/index.html b/applications/postman/index.html index 2bcd4d63a..9eea7f67a 100644 --- a/applications/postman/index.html +++ b/applications/postman/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/powershell/index.html b/applications/powershell/index.html index f88a87943..1a7a8afd4 100644 --- a/applications/powershell/index.html +++ b/applications/powershell/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/putty-unix/index.html b/applications/putty-unix/index.html index 0a0e81d66..5c8b310f8 100644 --- a/applications/putty-unix/index.html +++ b/applications/putty-unix/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/putty-wine/index.html b/applications/putty-wine/index.html index 6231642dd..335f9c95d 100644 --- a/applications/putty-wine/index.html +++ b/applications/putty-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/qelectrotech/index.html b/applications/qelectrotech/index.html index 31856a754..7f7d87a1f 100644 --- a/applications/qelectrotech/index.html +++ b/applications/qelectrotech/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/remarkable/index.html b/applications/remarkable/index.html index 388d5d0c8..d3102bd01 100644 --- a/applications/remarkable/index.html +++ b/applications/remarkable/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/remmina/index.html b/applications/remmina/index.html index af89fcd64..9dd70e61f 100644 --- a/applications/remmina/index.html +++ b/applications/remmina/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/remotedesktopmanager/index.html b/applications/remotedesktopmanager/index.html index 49f015336..4f57a989c 100644 --- a/applications/remotedesktopmanager/index.html +++ b/applications/remotedesktopmanager/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/rhythmbox/index.html b/applications/rhythmbox/index.html index 449dffe56..a9b0b5854 100644 --- a/applications/rhythmbox/index.html +++ b/applications/rhythmbox/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/robots/index.html b/applications/robots/index.html index f3ab77c20..3f7de4232 100644 --- a/applications/robots/index.html +++ b/applications/robots/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/shotcut/index.html b/applications/shotcut/index.html index 1226cdc9b..3a9063ce9 100644 --- a/applications/shotcut/index.html +++ b/applications/shotcut/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/stellarium/index.html b/applications/stellarium/index.html index 7f7abd669..be5543ac8 100644 --- a/applications/stellarium/index.html +++ b/applications/stellarium/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/step/index.html b/applications/step/index.html index 40256dc8f..4b74238ce 100644 --- a/applications/step/index.html +++ b/applications/step/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/stress/index.html b/applications/stress/index.html index 6927fa1da..e6d680ca2 100644 --- a/applications/stress/index.html +++ b/applications/stress/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/sublime-text/index.html b/applications/sublime-text/index.html index fe76ed174..ae6fe3444 100644 --- a/applications/sublime-text/index.html +++ b/applications/sublime-text/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/sudoku/index.html b/applications/sudoku/index.html index 84bdab46e..1269cb4eb 100644 --- a/applications/sudoku/index.html +++ b/applications/sudoku/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/supertux2/index.html b/applications/supertux2/index.html index 2efce524e..98afd12e5 100644 --- a/applications/supertux2/index.html +++ b/applications/supertux2/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/swell-foop/index.html b/applications/swell-foop/index.html index d8bab2aa4..6230f39fb 100644 --- a/applications/swell-foop/index.html +++ b/applications/swell-foop/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/taquin/index.html b/applications/taquin/index.html index 9557625f2..aa175ab76 100644 --- a/applications/taquin/index.html +++ b/applications/taquin/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/teams/index.html b/applications/teams/index.html index 01c0587ab..5ca153020 100644 --- a/applications/teams/index.html +++ b/applications/teams/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/terminal/index.html b/applications/terminal/index.html index 04b1e9881..02ec96a8b 100644 --- a/applications/terminal/index.html +++ b/applications/terminal/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/terminalai/index.html b/applications/terminalai/index.html index 182238873..7607b6b66 100644 --- a/applications/terminalai/index.html +++ b/applications/terminalai/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/terminalephemeral/index.html b/applications/terminalephemeral/index.html index 913b906ed..649eab4dc 100644 --- a/applications/terminalephemeral/index.html +++ b/applications/terminalephemeral/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/terminalpod/index.html b/applications/terminalpod/index.html index a3d5b9347..1c6bcba80 100644 --- a/applications/terminalpod/index.html +++ b/applications/terminalpod/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/tetravex/index.html b/applications/tetravex/index.html index 8d3a40de4..387cdfd12 100644 --- a/applications/tetravex/index.html +++ b/applications/tetravex/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/thunderbird/index.html b/applications/thunderbird/index.html index 55fad3016..2d6af55bd 100644 --- a/applications/thunderbird/index.html +++ b/applications/thunderbird/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vice/index.html b/applications/vice/index.html index e4c723719..0784273ee 100644 --- a/applications/vice/index.html +++ b/applications/vice/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vlc/index.html b/applications/vlc/index.html index ff2e580ab..232f30308 100644 --- a/applications/vlc/index.html +++ b/applications/vlc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vmmacos/index.html b/applications/vmmacos/index.html index e5fcf72cf..9331ea779 100644 --- a/applications/vmmacos/index.html +++ b/applications/vmmacos/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vmrc/index.html b/applications/vmrc/index.html index 0739e86d4..e36ad89af 100644 --- a/applications/vmrc/index.html +++ b/applications/vmrc/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vmubuntu/index.html b/applications/vmubuntu/index.html index ca4d7d1bb..3d1f4fc29 100644 --- a/applications/vmubuntu/index.html +++ b/applications/vmubuntu/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/vscode/index.html b/applications/vscode/index.html index 5486fd3bc..0b92f3678 100644 --- a/applications/vscode/index.html +++ b/applications/vscode/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/weather/index.html b/applications/weather/index.html index 098b5d78c..3f78de2b3 100644 --- a/applications/weather/index.html +++ b/applications/weather/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/whatsdesk/index.html b/applications/whatsdesk/index.html index e3373d1df..264ef6505 100644 --- a/applications/whatsdesk/index.html +++ b/applications/whatsdesk/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/winefile-wine/index.html b/applications/winefile-wine/index.html index 0c211be9e..0efb66385 100644 --- a/applications/winefile-wine/index.html +++ b/applications/winefile-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/winemine-wine/index.html b/applications/winemine-wine/index.html index 36dc3ec1f..887ad7aba 100644 --- a/applications/winemine-wine/index.html +++ b/applications/winemine-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/winhelp-wine/index.html b/applications/winhelp-wine/index.html index c03c552bd..cc0634262 100644 --- a/applications/winhelp-wine/index.html +++ b/applications/winhelp-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/winscp-wine/index.html b/applications/winscp-wine/index.html index 0545acbc0..0f68fbbbb 100644 --- a/applications/winscp-wine/index.html +++ b/applications/winscp-wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/wireshark/index.html b/applications/wireshark/index.html index 10f9b4735..e5f790ff5 100644 --- a/applications/wireshark/index.html +++ b/applications/wireshark/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/writer/index.html b/applications/writer/index.html index 9cc781bf1..3bbae1902 100644 --- a/applications/writer/index.html +++ b/applications/writer/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xclock/index.html b/applications/xclock/index.html index fcdc1b3ca..9c835953a 100644 --- a/applications/xclock/index.html +++ b/applications/xclock/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xedit/index.html b/applications/xedit/index.html index c335644cc..4d1b96b59 100644 --- a/applications/xedit/index.html +++ b/applications/xedit/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xeyes/index.html b/applications/xeyes/index.html index bd64e45ff..92c6995fd 100644 --- a/applications/xeyes/index.html +++ b/applications/xeyes/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xman/index.html b/applications/xman/index.html index b29688246..5f8be2291 100644 --- a/applications/xman/index.html +++ b/applications/xman/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xpad/index.html b/applications/xpad/index.html index 8c5ca7a77..b99f4030f 100644 --- a/applications/xpad/index.html +++ b/applications/xpad/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/xterm/index.html b/applications/xterm/index.html index 992b90f4e..3eca24cb6 100644 --- a/applications/xterm/index.html +++ b/applications/xterm/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applications/youtube/index.html b/applications/youtube/index.html index b88502c2e..91842e01f 100644 --- a/applications/youtube/index.html +++ b/applications/youtube/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/applicationsformat/index.html b/applicationsformat/index.html index 91686770d..5706cef09 100644 --- a/applicationsformat/index.html +++ b/applicationsformat/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/architecture/index.html b/architecture/index.html index 5ac42e7e6..23ccfc84d 100644 --- a/architecture/index.html +++ b/architecture/index.html @@ -1855,6 +1855,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/buildapplications.wine/index.html b/buildapplications.wine/index.html index 2558603c8..ea9ee19b8 100644 --- a/buildapplications.wine/index.html +++ b/buildapplications.wine/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/buildapplicationsgnulinux/index.html b/buildapplicationsgnulinux/index.html index ef46d0746..0258bda28 100644 --- a/buildapplicationsgnulinux/index.html +++ b/buildapplicationsgnulinux/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/changelog/index.html b/changelog/index.html index f678c669e..e5459302e 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -1886,6 +1886,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/cheatsheets/bash/index.html b/cheatsheets/bash/index.html index f2f0b7631..c2f8b87f1 100644 --- a/cheatsheets/bash/index.html +++ b/cheatsheets/bash/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/cheatsheets/docker/index.html b/cheatsheets/docker/index.html index d2d12e635..e7cf9c357 100644 --- a/cheatsheets/docker/index.html +++ b/cheatsheets/docker/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/cheatsheets/macos/index.html b/cheatsheets/macos/index.html index 43b88df63..6351286be 100644 --- a/cheatsheets/macos/index.html +++ b/cheatsheets/macos/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/1.0/abcdesktop.bastion/index.html b/common/1.0/abcdesktop.bastion/index.html index 7c86c6759..e98527b4d 100644 --- a/common/1.0/abcdesktop.bastion/index.html +++ b/common/1.0/abcdesktop.bastion/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/1.0/docker_macvlan/index.html b/common/1.0/docker_macvlan/index.html index 0ea1b1cce..259beb121 100644 --- a/common/1.0/docker_macvlan/index.html +++ b/common/1.0/docker_macvlan/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/1.0/update_frontend_image/index.html b/common/1.0/update_frontend_image/index.html index c0852b502..67c3f7151 100644 --- a/common/1.0/update_frontend_image/index.html +++ b/common/1.0/update_frontend_image/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/3.0/createcontainerisedapplicationdebug/index.html b/common/3.0/createcontainerisedapplicationdebug/index.html index 9e6a8ff4a..9f2b58c31 100644 --- a/common/3.0/createcontainerisedapplicationdebug/index.html +++ b/common/3.0/createcontainerisedapplicationdebug/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/3.0/mount_nfs_tag/index.html b/common/3.0/mount_nfs_tag/index.html index 4a33d1fe9..afa0058e5 100644 --- a/common/3.0/mount_nfs_tag/index.html +++ b/common/3.0/mount_nfs_tag/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/3.0/multiplegroupsfeature/index.html b/common/3.0/multiplegroupsfeature/index.html index ff3f3e590..018519851 100644 --- a/common/3.0/multiplegroupsfeature/index.html +++ b/common/3.0/multiplegroupsfeature/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/3.0/update_frontend_image/index.html b/common/3.0/update_frontend_image/index.html index c81edb1f6..7fb3c8723 100644 --- a/common/3.0/update_frontend_image/index.html +++ b/common/3.0/update_frontend_image/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/3.3/update_frontend_image/index.html b/common/3.3/update_frontend_image/index.html index 95df7c99d..e281812ae 100644 --- a/common/3.3/update_frontend_image/index.html +++ b/common/3.3/update_frontend_image/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/acl/index.html b/common/acl/index.html index 5171a4176..f34eebb22 100644 --- a/common/acl/index.html +++ b/common/acl/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/custom-wallpaper/index.html b/common/custom-wallpaper/index.html index fe86807fe..e2f98a724 100644 --- a/common/custom-wallpaper/index.html +++ b/common/custom-wallpaper/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/debug_application/index.html b/common/debug_application/index.html index 76ec713a0..236ebf939 100644 --- a/common/debug_application/index.html +++ b/common/debug_application/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/disable-firefox-connections/index.html b/common/disable-firefox-connections/index.html index 936ad8778..094a2a3b1 100644 --- a/common/disable-firefox-connections/index.html +++ b/common/disable-firefox-connections/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/exec_command_as_root_inside_container_without_docker/index.html b/common/exec_command_as_root_inside_container_without_docker/index.html index 648fb5483..e8fd3dfc3 100644 --- a/common/exec_command_as_root_inside_container_without_docker/index.html +++ b/common/exec_command_as_root_inside_container_without_docker/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/firefox-extension/index.html b/common/firefox-extension/index.html index 9977ffc0b..90032adc1 100644 --- a/common/firefox-extension/index.html +++ b/common/firefox-extension/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/flash-firefox-esr/index.html b/common/flash-firefox-esr/index.html index c17a32e69..7360ba66a 100644 --- a/common/flash-firefox-esr/index.html +++ b/common/flash-firefox-esr/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/non-free-applications/index.html b/common/non-free-applications/index.html index 38f250f71..8cdf17608 100644 --- a/common/non-free-applications/index.html +++ b/common/non-free-applications/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/shm/index.html b/common/shm/index.html index 1d71840a7..03561a351 100644 --- a/common/shm/index.html +++ b/common/shm/index.html @@ -1724,6 +1724,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/common/upload_and_download_files/index.html b/common/upload_and_download_files/index.html index c6d8bf98f..8413a9884 100644 --- a/common/upload_and_download_files/index.html +++ b/common/upload_and_download_files/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/memcached/index.html b/core/memcached/index.html index 34078c233..67c463b81 100644 --- a/core/memcached/index.html +++ b/core/memcached/index.html @@ -1794,6 +1794,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/mongodb/index.html b/core/mongodb/index.html index 59c36c9f4..e87a3a7cd 100644 --- a/core/mongodb/index.html +++ b/core/mongodb/index.html @@ -1818,6 +1818,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/nginx/index.html b/core/nginx/index.html index d64f31430..667631c95 100644 --- a/core/nginx/index.html +++ b/core/nginx/index.html @@ -1821,6 +1821,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/ocuser/index.html b/core/ocuser/index.html index 3141b3fab..caa000b99 100644 --- a/core/ocuser/index.html +++ b/core/ocuser/index.html @@ -1968,6 +1968,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/pyos/index.html b/core/pyos/index.html index 187f6d30b..5417a37de 100644 --- a/core/pyos/index.html +++ b/core/pyos/index.html @@ -1740,6 +1740,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/core/speedtest/index.html b/core/speedtest/index.html index 6568ecbcb..39e6f9838 100644 --- a/core/speedtest/index.html +++ b/core/speedtest/index.html @@ -1779,6 +1779,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/faq/index.html b/faq/index.html index 4557af564..ac86bd6b1 100644 --- a/faq/index.html +++ b/faq/index.html @@ -1726,6 +1726,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/guiappsoddocker/index.html b/guiappsoddocker/index.html index 864075535..da267752d 100644 --- a/guiappsoddocker/index.html +++ b/guiappsoddocker/index.html @@ -1870,6 +1870,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/index.html b/index.html index 34c3aff51..bc11c12a6 100644 --- a/index.html +++ b/index.html @@ -1879,6 +1879,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/overview/index.html b/overview/index.html index f816ed6ed..1f31a2c83 100644 --- a/overview/index.html +++ b/overview/index.html @@ -1736,6 +1736,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/rdgp/index.html b/rdgp/index.html index e0a2720c2..f5b87dadb 100644 --- a/rdgp/index.html +++ b/rdgp/index.html @@ -1717,6 +1717,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/requirements/index.html b/requirements/index.html index 8b4abd63c..640aead32 100644 --- a/requirements/index.html +++ b/requirements/index.html @@ -1832,6 +1832,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/runapplications.wine/index.html b/runapplications.wine/index.html index 93f53fdfa..e965e3020 100644 --- a/runapplications.wine/index.html +++ b/runapplications.wine/index.html @@ -1722,6 +1722,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/search/search_index.json b/search/search_index.json index 59558a4f8..5fb26ddea 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"

    abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.

    abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.

    This flexible working environment simplifies usage like

    • Telecommuting
    • Remote virtual desktop
    • Give temporary access to other contractors or guests
    • Training
    • BYOD, Bring Your Own Device
    • Desktop On Demand, Desktop as a service
    "},{"location":"#quick-online-preview","title":"Quick online preview","text":"

    You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.

    To reach the demo website, follow the link https://demo.abcdesktop.io

    "},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"

    abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.

    "},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"

    You can watch the youtube video sample. This video describes the Quick installation process.

    Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
    "},{"location":"#adopters","title":"Adopters","text":"

    Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!

    Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":"
    • Complete native cloud desktop, workspace environment
    • Authentification OAuth 2.0, LDAP bind, LDAPS bind, Active Directory, Active Directory trust, Kerberos, NTLM
    • Access to the user home directory (homeDirectory support in Active Directory)
    • Legacy CIFS FlexVolume using kubernetes driver
    • All graphical applications run inside containers, as pods or as ephermeral containers
    • Local and remote printing support
    • Off-line sessions are maintained
    • No need to install applications any more
    • Application update, run latest image on your private registry
    • Accounting and reporting (Graylog, Prometheus Grafana)
    • Clipboard syncing with https
    • Sound support with WebRTC signalling and gstreamer webrtcbin
    • Nvidia GPU support for applications
    • Support RFC 2307 to use LDAP as a Network Information Service
    "},{"location":"#applications","title":"Applications","text":"
    • Native support GNU/Linux console native support
    • Native support GNU/Linux X11 applications native support
    • Support Microsoft Windows applications using Wine
    "},{"location":"#supported-web-browser-html","title":"Supported web browser HTML","text":"

    abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:

    • Chrome 49,
    • Firefox 58,
    • Safari 11,
    • Opera 36,
    • Microsoft Edge (based on Chromium)
    "},{"location":"#copy-and-paste-features","title":"Copy and Paste features","text":"

    To fully use copy and paste features, from your local device to your abcdesktop (and vice versa), choose Chrome, Chromium or Microsoft Edge Chromium. The copy and paste feature is also supported on Firefox with a dedicated abcdesktop extension.

    Web browser Clipboard sync Chrome Yes, built in support Chromium Yes, built in support Microsoft Edge Chromium Yes, built in support Firefox Yes, install the dedicated abcdesktop extension Safari No, the clipboard access is not allowed by the user agent or the platform in the current context, possibly because the user denied permission"},{"location":"#not-supported-web-browser","title":"Not supported web browser","text":"

    abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.

    "},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"

    abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.

    "},{"location":"adopters/","title":"Adopters","text":"

    Here are some of the organizations we know are using abcdesktop.io.

    Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications

    If you\u2019re using abcdesktop.io and aren\u2019t on this list, please submit a pull request to add entry in this list.

    "},{"location":"applicationsformat/","title":"Application image format","text":"

    abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.

    "},{"location":"applicationsformat/#requirements","title":"Requirements","text":"
    • A running container enegine (like dockerd)
    • An access to the docker public registry
    "},{"location":"applicationsformat/#labels","title":"Labels","text":"

    Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.

    LABEL oc.type=app\n
    "},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ] office oc.launch string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path string Path to the application binary /usr/bin/firefox oc.args string arguments added to the command --open oc.name string Name of the application Firefox oc.displayname string Display Name show by Web interface Firefox oc.type string Always set to the value 'app' app oc.mimetype string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview string Set to the dock to add this app in dock dock oc.fileextensions string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config dict dictionary of resources (see resources details) { 'shm_size': '1g' }

    Example for Firefox application

    LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
    "},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n

    Read the dedicated chapter for resource description, to get more informations on host_config

    "},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"

    To download an abcdesktop docker image, run the command

    docker pull abcdesktopio/firefox.d\n

    To inspect the labels in the docker image, run docker inspect

    docker inspect abcdesktopio/firefox.d:latest\n

    Read the labels section :

    \"Labels\": {\n                \"architecture\": \"x86_64\",\n                \"oc.cat\": \"office\",\n                \"oc.desktopfile\": \"firefox.desktop\",\n                \"oc.displayname\": \"Firefox\",\n                \"oc.fileextensions\": \"htm;html;xml;gif\",\n                \"oc.icon\": \"firefox.svg\",\n                \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n                \"oc.keyword\": \"firefox,mozilla,web,internet\",\n                \"oc.launch\": \"Navigator.Firefox\",\n                \"oc.legacyfileextensions\": \"htm;html;xml\",\n                \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n                \"oc.name\": \"Firefox\",\n                \"oc.path\": \"/usr/bin/firefox\",\n                \"oc.showinview\": \"dock\",\n                \"oc.template\": \"oc.template.gtk.firefox\",\n                \"oc.type\": \"app\",\n                \"oc.usedefaultapplication\": \"true\",\n                \"release\": \"5\",\n                \"vcs-ref\": \"master\",\n                \"vcs-type\": \"git\",\n                \"version\": \"1.2\"\n }\n
    "},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"

    All abcdesktop applications use by default the oc.template.gtk images name.

    "},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"

    By default, oc.templace.gtk is the main image for all applications. For example oc.template.gtk.firefox use the oc.template.gtk image. oc.template.gtk.firefox.acme use the oc.template.gtk.firefox.

    • The oc.template.gtk.firefox contains the Mozilla Firefox application.
    • The oc.template.gtk.firefox.acme may contain custom set for Mozilla Firefox application, like Root CA, proxy values or policy.json files for the acme.
    +------------------------------+\n|oc.template.gtk.firefox.acme  |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk.firefox       |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk               |\n+---------------+--------------+\n
    "},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"
    1. User login, get a user JWT
    2. Create a user POD (or a container) and retrieve a Desktop JWT
    3. Run, the user is connected to his own POD (or container)

      • All JWT are signed with RSA keys.
      • All JWT payload are encrypted with RSA keys
    "},{"location":"architecture/#services-infrastructure","title":"Services Infrastructure","text":"

    The service infrastructure is based on :

    • WebServer Nginx container
    • Database service MongoDB
    • Memcached service Memcached
    • Pyos Core service (abcdesktop engine) Pyos

    The user creates a pod user

    "},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"

    pyos is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :

    • Authenticate user on authenticate providers
    • OAuth 2.0 Provider : Google, Facebook, Orange
    • LDAP and LDAPS
    • Active Directory
    • Start/Stop user container in docker mode and Pod in Kubernetes mode
    • Start/Stop application container

    When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.

    "},{"location":"architecture/#nginx","title":"nginx","text":"

    nginx container act as web server and websocket reverse proxy.

    "},{"location":"architecture/#mongo","title":"mongo","text":"

    mongo is used by pyos to store user profil informations. The profil informations are :

    • Login history
    • Dock configuration
    • Image and background color configuration
    "},{"location":"architecture/#memcached","title":"memcached","text":"

    memcache stores progress text message information during login process. memcache datas are set and get only by the control plane.

    "},{"location":"architecture/#ocuser","title":"oc.user","text":"

    oc.user is the name of the user's container image. oc.user runs the X11 graphical service. oc.user is based on ubuntu distribution.

    • The image abcdesktopio/oc.user.ubuntu:3.0 is based on ubuntu distribution 22.04. Get more details about oc.user image.
    "},{"location":"architecture/#applications","title":"applications","text":"

    All applications are containers or pods, and share a graphical socket with the user's container

    "},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"
    • Read the chapter Edit your configuration file in docker mode is mandatory
    • Read the chapter Build abcdesktop docker image is mandatory.
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.

    abcdesktop can run Microsoft Windows applications using Wine.

    "},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded in oc.template.gtk.wine image","text":"

    To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.

    Start pulling this template image, if you don't have already done in the previous exercice :

    docker pull abcdesktopio/oc.template.gtk.wine\n

    This image embeded the architecture format win32 win64. By default the WINEARCH is set to win32. The playonlinux package is all ready installed.

    "},{"location":"buildapplications.wine/#change-the-odconfig-configuration-file","title":"Change the od.config configuration file","text":""},{"location":"buildapplications.wine/#the-homedirectorytype-option","title":"The homedirectorytype option","text":"

    To share the home directory /home/balloonvolume data between containers, set the desktop.homedirectorytype to 'volume' in your od.config file.

    Edit your own od.config file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype is set to 'volume'

    desktop.homedirectorytype: 'volume' \n

    If need, run the docker-compose restart command in your abcdesktop directory where the od.config and the docker-compose.yml are located.

    docker-compose restart\n
    "},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"

    In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.

    PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.

    Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

    In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.

    Login using the Anonymous authentification provider.

    Click on the menu and choose settings options

    On the Settings dialog box, choose System option

    Choose the User container tabs, and select the hostname value.

    Copy this value into your clipboard. The hostname use the docker containerid value.

    Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.

    Run the docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

    CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n

    where CONTAINER_ID is your own containerid value.

    For example

    docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n

    You should read the volume name starting by the prefix tmp- with your uuid value, and a second volume name starting by the prefix home- with your uuid:

    [tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n

    We are using the /tmp volume and the /home/balloon volume of your container.

    If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf. The name of the tmp volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf and the name of tmp volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf

    If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes. The name of the tmp volume is tmp-hermes and the name of tmp volume is home-hermes.

    Replace in the command the string TMP_VOLUMENAME by your own tmp volume name.

    Replace in the command the string HOME_VOLUMENAME by your own home volume name.

    docker run -it -v TMP_VOLUMENAME:/tmp  -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n

    For example with an anonymous user:

    docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n

    Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

    To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n

    Init the wine directory

    wineboot --init\n

    After few seconds you should read on the standard error

    0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

    And now download putty.exe from the web site https://www.putty.org/.

    In this example, we use the 64 bits binary format

    balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n

    Start the putty.exe with wine, with the command wine putty.exe

    balloon@5719b77d3f2a:~$ wine putty.exe\n

    After few seconds you should read on the standard error

    0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n

    The wine prefix is WINEPREFIX=/composer/.wine, all files used by wine are stored in /composer/.wine directory.

    On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :

    You can use this Putty Windows application to connect to another host using ssh or telnet protocol.

    The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell Click on the Web Shell icon, a new Terminal WebShell is now opened :

    Run the command to list each X11 windows and get the WMClass name.

    wmctrl -lx \n

    Read the WM_CLASS of the Putty Wine application: putty.exe.Wine

    Then exit the web shell and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine.

    "},{"location":"buildapplications.wine/#build-the-new-puttyd-image-for-abcdesktop","title":"Build the new putty.d image for abcdesktop","text":"

    In this chapter we are going to build a new docker image for abcdesktop

    The new image is the putty.

    Create a directory named build, and create a directory icons inside build

    mkdir build\nmkdir build/icons\ncd build\n

    To build your own json file.

    Create a json file named applist.json, inside build directory, and add the content to the json file.

    [\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

    To fill the data inside the json file :

    name Type Data cat string utilities icon string putty.svg keyword string putty,ssh,terminal launch string putty.exe.Wine name string putty path string /usr/bin/wine args string /composer/bin/putty.exe template string abcdesktopio/oc.template.gtk.wine

    You can read the following help lines.

    • cat is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
    • icon is the name of the icon. abcdesktop support only svg icon file format. To get the icon file, look at the link https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg
    • keyword is a list of the keywords to find the application. Set the value to putty,ssh,terminal.
    • launch is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below).
    • name is the name of the application. Set the value to putty.
    • path is the binary path to run the application.
    • template is the name of the parent image. The default image parent for wine is abcdesktopio/oc.template.gtk.wine.

    Save the putty icon file on SVG format to the icons directory.

    wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
    "},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json","text":"

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

    Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

    If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

    In the build directory, you should have

    drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   497 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 icons\n-rw-r--r--   1 devuser  staff  6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 putty.svg\n

    Run the command make.js

    node make.js\n

    make.js build a new DockerFile for putty application. Remember, all application images use container images.

    You should get the output

    {\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp', \n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\n

    The new files putty-wine.d has been generated :

    • putty-wine.d is the Dockerfile for your putty abcdesktop application

    Read the content of the Dockerfile putty-wine.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

    Now it's time to build your putty app. Run the command docker build command.

    docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

    You should read on the standard ouput

    [+] Building 21.6s (10/10) FINISHED                                                                                      \n => [internal] load build definition from putty-wine.d                                                              0.0s\n => => transferring dockerfile: 12.46kB                                                                             0.0s\n => [internal] load .dockerignore                                                                                   0.0s\n => => transferring context: 2B                                                                                     0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev                                    0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev                                               0.0s\n => [2/6] RUN wineboot --init                                                                                      10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe             0.6s \n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                9.2s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                0.4s \n => [6/6] WORKDIR /home/balloon                                                                                     0.0s \n => exporting to image                                                                                              0.4s \n => => exporting layers                                                                                             0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd                        0.0s \n => => naming to docker.io/library/putty-wine.d                                                                     0.0s\n

    Now, your new image is ready to run.

    "},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"

    The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.

    Using your web browser or a curl command, call a http request to notify the API Server

    http://localhost/API/manager/buildapplist\n

    This http request return a json object, with all docker images details :

    Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.

    In the search area, type putty. Click on the Putty Application.

    Wine is starting your Putty application :

    Great, you have build a abcdesktop image for Putty, build the application image Putty. You can push this image to your own private docker registry.

    "},{"location":"buildapplications.wine/#optional-add-a-persistant-userreg-and-systemreg-windows-registry-files","title":"Optional add a persistant user.reg and system.reg windows registry files","text":"

    This is a quick and dirty solution, but it works fine

    Your wine configuration is stored in /composer/.wine, and by default user.reg and system.reg are located in the WINEPREFIX directory. The user.reg and system.reg files build when wine starts.

    To make a copy of fresh running putty-wine.d image. Start your putty-wine.d image and using a shell located the new user.reg and system.reg files

    docker ps -a | grep putty-wine\n65d95f4e7717   putty-wine.d:latest                               \"/composer/appli-doc\u2026\"   16 seconds ago   Up 15 seconds                                                                                                    anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n

    Then copy files using the docker cp command

    CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n

    Add them to your default putty-wine.d image using applist.json file :

    [\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

    Rebuild your Dockerfile

    node make.js\n
    {\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp',\n    'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n

    Run the command docker build command.

    docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

    Now your wine keep your registry's updates.

    "},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"

    abcdesktop use docker image format with some labels to describe the application.

    "},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.
    • The root password of the oc.user docker image. The default password is lmdpocpetit, but this value may have been changed.
    "},{"location":"buildapplicationsgnulinux/#build-your-own-application-image_1","title":"Build your own application image","text":"

    In this chapter we are going to build a new docker image for abcdesktop

    The new image is the game 2048.

    Create a directory named build, and create a directory icons inside build

    mkdir build\nmkdir build/icons\ncd build\n

    To build your own image create first a json file.

    Create a json file named applist.json, inside build directory, and add the content to the json file.

    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n]\n

    To fill the data inside the json file :

    name Type Data cat string games debpackage string 2048-qt icon string 2048_logo.svg keyword string 2048 launch string 2048-qt.2048-qt name string 2048 path string /usr/games/2048-qt template string abcdesktopio/oc.template.gtk

    You can read the following help lines, or fill the json missing value by yourself.

    • cat is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
    • debpackage is the name of the 2048 ubuntu package. To find the package name, look at the link 2048 Ubuntu Package.
    • icon is the name of the icon. abcdesktop support only svg icon file format. To get the icon file, look at the link https://upload.wikimedia.org/wikipedia/commons/1/18/2048_logo.svg
    • keyword is a list of the keywords to find the application. Set the value to 2048.
    • launch is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below).
    • name is the name of the application. Set the value to 2048.
    • path is the binary path to run the application.
    • template is the name of the parent image. The default image parent is abcdesktopio/oc.template.gtk. You will learn how to customize your own template image, in next chapter.

    Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons command :

    2048_logo.svg\n
    "},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

    Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

    If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

    In the build directory, you should have

    drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   265 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 img\n-rw-r--r--   1 devuser  staff  8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 2048_logo.svg\n

    Run the command make.js

    node make.js\n

    make.js build a new DockerFile for the 2048 application. Remember, all application images use container images.

    You should get the output

    {\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n        - '2048'   : '2048.md'\n

    The new files 2048.d and 2048.md have been generated :

    • 2048.d is the Dockerfile for your 2048 abcdesktop application
    • 2048.md is the documentation file for your 2048 abcdesktop application

    Read the content of the Dockerfile 2048.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

    Now it's time to build your 2048 app. Run the command docker build command.

    docker build  --build-arg TAG=latest -f 2048.d -t 2048.d .\n

    You should read the output :

    [+] Building 32.0s (10/10) FINISHED                                                                                                                                                                 \n => [internal] load build definition from 2048.d                                                                                                                                               0.0s\n => => transferring dockerfile: 33B                                                                                                                                                            0.0s\n => [internal] load .dockerignore                                                                                                                                                              0.0s\n => => transferring context: 2B                                                                                                                                                                0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest                                                                                                                 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB                                                                                                 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB                                                                                                 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean                                                           27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                   0.5s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                           0.5s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                           0.4s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                0.0s \n => exporting to image                                                                                                                                                                         1.1s \n => => exporting layers                                                                                                                                                                        1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a                                                                                                   0.0s\n => => naming to docker.io/library/2048.d\n

    Check that your image is ready on your system:

    Run the docker images command

    docker images\n

    You should read on the stdout more lines, only 2048.d is listed here :

    REPOSITORY                           TAG                                                     IMAGE ID       CREATED              SIZE\n2048.d                               latest                                                  a861af06b7f0   About a minute ago   1.17GB\n

    The total image size of 2048.d is 1.17GB.

    The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk.

    "},{"location":"buildapplicationsgnulinux/#update-the-cache-application-list","title":"Update the cache application list","text":"

    The API server receives a new image event from docker. To run the new applications just refresh you web browser page.

    "},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"

    Return to your abcdesktop website http://localhost and log in as Anonymous.

    At the right corner, write in the search bar the keyword 2048

    Click on the 2048 icon, and start your first abcdesktop application :

    Great it's a good job, you have build your own abcdesktop 2048 application.

    Now you can spent a lot of time to reach the 2048 score. Have fun !

    "},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Get launch and path values","text":"

    To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.

    If you want to use abcdesktop as a GNU/Linux host

    Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch and path.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right corner, write in the search bar the keyword shell

    Click on the Web Shell icon, a new Terminal WebShell is now opened :

    Run the command

    sudo apt-get update \n

    The default password is lmdpocpetit ( if your admin did not change it, otherwise ask to the administrator )

    Run the installation command

    sudo apt-get install -y 2048-qt \n

    You should read the output, during the installation process

    On Ubuntu, the games are installed in a dedicated directory /usr/games.

    Read the file list of the 2048-qt Ubuntu package

    /usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n

    Start the 2048 game binary 2048-qt in background.

    /usr/games/2048-qt & \n

    The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.

    Run the command to list each X11 windows and get the WMClass name.

    wmctrl -lx \n

    wmctrl is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.

    • -l list the windows being managed by the window manager.
    • -x include WM_CLASS in the window list

    Great, look at the third value, this is what we are looking for :

    • The launch is 2048-qt.2048-qt
    • The path is /usr/games/2048-qt

    You can now close your web browser and fill your json file, by yourself

    "},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"

    The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.

    By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.

    New applist.json data, and build your own Gimp abcdesktop.io application.

    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"\",\n    \"debpackage\": \"\",\n    \"icon\": \"\",\n    \"keyword\": \"\",\n    \"launch\": \"t\",\n    \"name\": \"\",\n    \"displayname\": \"\",\n    \"path\": \"\",\n    \"template\": \"\"\n  }\n\n]\n

    You should get data entries like:

    • The GIMP icon SVG file is avalaible on wikipedia website The_GIMP_icon_-_gnome.svg
    • The wmctrl show the WM_CLASS gimp.Gimp
    • The path is /usr/bin/gimp
    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n\n]\n
    "},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"

    abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.

        \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n

    These entries allow user to use the file manager choice Open with and Open with Other Application

    and list Recommended Applications

    The Gimp Json data shows

    {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n

    Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.

    "},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"

    musl versus glibc

    "},{"location":"changelog/","title":"abcdesktop change log","text":"

    Logs of all notable changes made to abcdesktop.io

    "},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":"
    • to fix issue: https://github.com/abcdesktopio/oc.pyos/issues/2#issuecomment-1607671669 use WEBSOCKIFY_HEARTBEAT in od.config file OR use proxy-read-timeout and proxy-send-timeout annotations to kind: Ingress
    • add --heartbeat=${WEBSOCKIFY_HEARTBEAT} to /usr/bin/websockify to keep session
    • commit https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442
    "},{"location":"changelog/#commits-on-jun-16-2023","title":"Commits on Jun 16, 2023","text":""},{"location":"changelog/#ocuser-ocpyos-change-default-namespace","title":"oc.user, oc.pyos change default namespace","text":"
    • oc.pyos: support namespace change, new option in od.config file to change the default abcdesktop namespace
    • oc.user: support namespace change
    "},{"location":"changelog/#commits-on-jun-9-2023","title":"Commits on Jun 9, 2023","text":""},{"location":"changelog/#ocpyos-clusterrole-and-role","title":"oc.pyos: ClusterRole and role","text":"
    • replace ClusterRole to role
    • create new file for ClusterRole
    • role and ClusterRole are supported
    • commit https://github.com/abcdesktopio/conf/commit/5b27b4c9831197142f0fdb94ca72125bd2db4b7d
    "},{"location":"changelog/#commits-on-may-24-2023","title":"Commits on May 24, 2023","text":""},{"location":"changelog/#add-new-label-role-for-each-core-service","title":"add new label role for each core service","text":"
    • abcdesktop/role
    "},{"location":"changelog/#commits-on-may-17-2023","title":"Commits on May 17, 2023","text":""},{"location":"changelog/#replace-daemonset-by-deployment","title":"Replace daemonset by deployment","text":"

    -- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442

    "},{"location":"faq/","title":"FAQ","text":"

    List of questions and answers relating to abcdesktop.io

    A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.

    "},{"location":"faq/#networking","title":"Networking","text":"

    This list of questions and answers is relating network, talking about

    • port-forward
    • NodePort
    • LoadBalancer
    • Ingress Controler
    • WebSocket timeout
    "},{"location":"faq/#how-can-i-reach-my-new-service-on-a-kubernetes-cloud-provider","title":"How can I reach my new service on a Kubernetes cloud provider ?","text":"

    I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?

    We use the kubectl port-forward to the nginx pod

    NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n

    Then open your web browser to reach the http://localhost

    Then open your web browser, you get the home page, login using LDAP auth or Anonymous auth.

    Then login, and you get a pod user.

    For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.

    "},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"

    I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?

    To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer.

    Delete the previous abcdesktop's nginx service

    kubectl delete service nginx -n abcdesktop\n

    Create a new nginx service yaml file named nginx-lb.yaml The new nginx service type is LoadBalancer

    kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n

    Apply the nginx service type LoadBalancer

    kubectl apply -f nginx-lb.yaml\nservice/nginx created\n

    Wait for an EXTERNAL-IP from you kubernetes cloud provider

    kubectl get service nginx -n abcdesktop\nNAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nnginx   LoadBalancer   10.245.105.75   <pending>     80:31581/TCP   64s\n

    You get the EXTERNAL-IP for your LoadBalancer

    kubectl get service nginx -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      2m36s\n

    In case, the LoadBalancer service returns the EXTERNAL-IP 161.35.246.4 Then open your web browser to reach this EXTERNAL-IP 161.35.246.4.

    Login using Philip J. Fry

    And you should get the fry desktop

    "},{"location":"faq/#how-can-i-expose-my-new-service-with-ingress-controller","title":"How can I expose my new service with Ingress Controller ?","text":"

    A Kubernetes Ingress Controller acts as a reverse proxy.

    In the Ingress, define a path to the abcdesktop's nginx service.

    apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n

    The request path: / is proxyfied to service named nginx in abcdesktop namespace.

    "},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity","title":"How to prevent the connection from closing after 60 seconds of inactivity ?","text":"

    My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.

    The message Your abcdesktop session has been disconnected. Please reload this page appears when the websockify websocket is disconnected.

    Add an heartbeat value to send a ping to the client every INTERVAL seconds

    Edit the od.config file, add to the desktop.envlocal option 'WEBSOCKIFY_HEARTBEAT':'30'

    desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n

    In this case, the command /usr/bin/websockify sends a ping to the client every 30 seconds. This command runs in the user's pod.

    Update the configmap abcdesktop-config

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart the pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    To get more informations how to Keepalive in websockets

    Timeout is a main feature to preserve from unnecessary network bandwidth.

    "},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"

    My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.

    To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.

    Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout and nginx.ingress.kubernetes.io/proxy-send-timeout annotations to more than 60 seconds.

    apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\n  annotations:\n    nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n    nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n
    "},{"location":"faq/#applications","title":"Applications","text":"

    This list of questions and answers is relating abcdesktop's applications, talking about

    • /API/manager/images endpoints
    "},{"location":"faq/#how-to-delete-all-applications","title":"How to delete all applications ?","text":"

    To delete all applications use the images endpoint, replace localhost:30443 by your own datas

    curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n

    It returns a json list of all deleted applications

    [\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
    "},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"

    To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n

    The first start will pull the 2048 image, so it can take a while.

    "},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"

    To get the json file of a containerized application, you can use docker command or crictl command

    • docker command
    docker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
    • crictl command
    crictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
    "},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"

    Open the webshell and read the logs files.

    The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.

    • /tmp/lastcmd.log the init command log file created by /composer/appli-docker-entrypoint.sh
    • /tmp/lastcmdenv.log the last environment variables file
    • /tmp/NAME OF THE APPLICATION.log the command log file for the application
    "},{"location":"guiappsoddocker/","title":"GUI application with containers","text":""},{"location":"guiappsoddocker/#other-related-projets-about-vdi-and-containers","title":"Other related projets about VDI and containers","text":"

    A lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :

    • https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.

    • https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.

    • HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.

    • https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.

    • Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.

    • https://www.kasmweb.com Streaming containerized apps and desktops.

    • Docker and Wine Docker image that includes Wine and Winetricks for running Windows applications on Linux and macOS

    • n.eko This app uses Web RTC to stream a desktop inside of a docker container (doesn't use VNC)
    "},{"location":"guiappsoddocker/#x11-window-system-architecture","title":"X11 window system architecture","text":"

    In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]

    "},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"

    Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.

    We can approach this problem from three angles:

    "},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":"
    • we can bundle X11 server with our container image. All process run inside the same container.
    "},{"location":"guiappsoddocker/#separated-container","title":"Separated container","text":"
    • we can share the X11 server socket with the X11 client container as unix file socket on an external shared volume. Applications and X11 server run in dedicated containers.

    • we can share the X11 server socket with the container using TCP. X11 uses TCP as its transport protocol. Applications and X11 server run in dedicated containers.

    "},{"location":"guiappsoddocker/#abcdesktop-choices","title":"abcdesktop choices","text":"

    To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.

    • The unix file socket reduce the network tcp overhead.

    • The unix file socket garantes no latency troubleshooting. X11 uses a chatty protocol so that the network latency has a large impact when using X11

    Local is best, thus server and application need to run on the same node, if it can.

    "},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remote DISPLAY","text":"

    The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY in a <canvas> HTML element.

    "},{"location":"guiappsoddocker/#replace-x11-server-from-xorg-by-a-xvnc","title":"Replace X11 Server from X.org, by a Xvnc.","text":"

    Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.

    "},{"location":"guiappsoddocker/#convert-vnc-tcp-socket-in-to-a-websocket","title":"Convert VNC TCP socket in to a WebSocket","text":"

    The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :

    • websockify Websockify just translates WebSockets traffic to normal socket traffic. Websockify accepts the WebSockets handshake, parses it, and then begins forwarding traffic between the client and the target in both directions.

    • ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

    "},{"location":"guiappsoddocker/#use-a-vnc-javascript-client","title":"Use a VNC Javascript client","text":"

    The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.

    • noVNC is VNC client JavaScript library. noVNC follows the standard VNC protocol, but unlike other VNC clients it requires WebSockets support.
    "},{"location":"overview/","title":"abcdesktop overview","text":"

    abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.

    "},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"

    An application can run as ephemeral container or as pod.

    "},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":"
    • nginx : container act as static web server and reverse proxy router
    • pyos : container abcdesktop core control plane
    • memcached : container cache service
    • mongo : container database service to store user profil data
    "},{"location":"overview/#abcdesktop-pod-user","title":"abcdesktop pod user","text":"
    • user : pod user, one pod per connected user
    • applications : each graphical application runs inside a dedicated container. You need to create an container image for each application
    "},{"location":"overview/#applications","title":"applications","text":"
    • An application can run as ephemeral container or as pod, it MUST be a container.
    • An application can ask to start another container, like application helper for a web browser. By example, firefox container can ask to start videolan application. Then firefox is running inside a container, videolan is running inside another separated container.
    • abcdesktop manages a mimetype database for each application. The mimetype database is updated on the fly then new application is added.
    • Application resource limit is supported (CPU, memory) on pod.
    • The share memory /dev/shm between X.org and application is supported with the ephemeral container.
    • Application support ACL (Access Control List). Access to an application can be allowed for a user and denied for another one, using group membership for example.
    • Volumes can be mounted for an application or not for security reason.
    • Application can bind a dedicated network by using annotations.
    • Application can use GPU by using labels.
    "},{"location":"rdgp/","title":"Rdgp","text":"

    Privacy Notice: protecting your personal data

    The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.

    If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.

    In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.

    This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.

    This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.

    Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.

    We only process your personal data once we have your consent in the context of you request.

    Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.

    What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.

    Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.

    Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.

    What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.

    How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:

    Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15

    Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.

    How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.

    For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.

    Modification of the personal data protection notice This Privacy Notice is subject to change.

    "},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":"
    • Architecture x86-64 ( arm-64 is not yet available)
    • 15 GB of free space to store sample applications ( gimp, libreoffice writer, libreoffice calc, libreoffice math, libreoffice impress, firefox ) and core image services
    • a kubernetes cluster ready to run greater or equal to 1.24
    "},{"location":"requirements/#release-3x-stable","title":"Release 3.X [ stable ]","text":"
    • Kubernetes release greater or equal to 1.24
    • No depend to dockerd, an application runs as pod or as an ephermeral container
    • Support storageClass and persistent volume claims
    • Support cloud provider
    "},{"location":"requirements/#supported-architectures","title":"Supported Architectures","text":"

    Our images support only architectures x86-64. The architectures supported by this image is:

    Architecture Tag x86-64 amd64-latest

    arm-64 is in progress.

    "},{"location":"requirements/#gnulinux","title":"GNU/Linux","text":"

    The recommended distrubution is Ubuntu 22.04.2 LTS

    "},{"location":"requirements/#macosx","title":"MacOS/X","text":"

    Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

    "},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"

    Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

    "},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":"
    • Read the previous chapter Build abcdesktop docker image
    • Read the Chapter Authentification explicit for LDAP Directory Services is recommended but not mandatory.
    "},{"location":"runapplications.wine/#winehq","title":"WineHQ","text":"

    Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.

    To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50

    Start pulling this template image :

    docker pull abcdesktopio/oc.template.gtk.wine\n

    Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine on the https://hub.docker.com/ web site.

    For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine is created.

    Dockerfile information :

    dpkg --add-architecture i386 aptitude install -y wine

    "},{"location":"runapplications.wine/#run-notepadexe-for-windows-in-a-docker-container","title":"Run notepad.exe for Windows in a Docker container","text":"

    In this chapter we are going to run notepad.exe for Windows inside a docker container for abcdesktop.io.

    Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

    In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.

    Login using the Anonymous authentification provider.

    Keep your web browser open, then on your host, open a terminal shell window and run the command

    docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n

    The option --filter ancestor=abcdesktopio/oc.user.18.04 ask to filter only container with the image ancestor set with value abcdesktopio/oc.user.18.04 You should read the container with the image named abcdesktopio/oc.user.18.04

    docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                                            NAMES\n86df3ff126ac   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   3 minutes ago   Up 3 minutes   4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp  g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n

    Read the values CONTAINER ID and NAMES

    In this example, the CONTAINER ID is 86df3ff126ac and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138.

    We are using the /tmp volume of this CONTAINER ID 86df3ff126ac

    Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be. The name of the tmp volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be

    Run a docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

    docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n

    For example

    docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n

    You should read the volume name starting by tmp- with your uuid concatened

    [tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n

    Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes. The name of the tmp volume is tmp-hermes

    Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"

    docker run -it -v TMP_VOLUMENAME:/tmp  --user balloon abcdesktopio/oc.template.gtk.wine bash\n

    For example with an Anonymous user:

    docker run -it -v  tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n

    Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

    To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n

    And now start the notepad.exe with wine

    balloon@8684ae888f74:/$ wine notepad\n

    After few seconds you should read on the standard error

    balloon@8684ae888f74:/$  wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

    And the notepad window should be open inside your Web browser

    This Windows application is running inside a docker container on abcdesktop.io desktop.

    In the Terminal shell press CTRL+C to stop the wine notepad process, then type exit to quit your shell in container.

    ^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n

    It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.

    "},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"

    The abcdesktop release 1.0 has started in May 2015

    • docker instance version 18 and above.
    • abcdesktop 1.0 (pyos) need a dockerd socket access.
    • Kubernetes release less or equal than 1.23.7-00 (if you use kubernetes release 1.24 or above, you must use abcdesktop release 3.0)
    • abcdesktop release 1.0 is deprecated
    "},{"location":"1.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"1.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"1.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"1.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"

    The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

    Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.

    "},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

    The authmanagers is defined as a dictionnary object :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    The od.config defines 3 kinds of entries in the authmanagers object :

    • external: use for OAuth 2.0 Authentification
    • explicit: use for LDAP, LDAPS and ActiveDirectory Authentification
    • implicit: use for Anonymous Authentification
    "},{"location":"1.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external OAuth 2.0 Authentification explicit LDAP, LDAPS and Active Directory Authentification implicit Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"

    You should have read the hands-on :

    • Edit your configuration file in docker mode
    "},{"location":"1.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

    Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit, explicit, and external, as describe :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    Save your new od.config file.

    The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.

    docker-compose restart

    Start your web browser and open the URL http://localhost

    The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

    Great you can now add some value to authenticate your users.

    "},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.

    "},{"location":"1.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.

    "},{"location":"1.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

    external is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.

    "},{"location":"1.0/config/authentification/#authmanagers-configuration-sample","title":"Authmanagers configuration sample","text":"

    In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers dictionnary as described for example :

    authmanagers: {\n  'external': {\n    'providers': {\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'client_id':     'XXXXXXX', \n        'client_secret': 'YYYYYYY', \n        'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n        'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n      },\n      'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'client_id':      'AAAAAAAA', \n        'client_secret':  'BBBBBBBB',\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n        'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'mobileorange': { \n        'displayname': 'Mobile Connect', \n        'enabled': False,\n        'client_id':     'CCCCCCCC', \n        'client_secret': 'DDDDDDDD',\n        'basic_auth': True,\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n        'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id':     'EEEEEEEE.apps.googleusercontent.com', \n        'client_secret': 'FFFFFFFF',\n        'scope': 'https://www.googleapis.com/auth/userinfo.email',\n        'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n        'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { 'AD': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                        'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                        'domain'        : 'AD',\n                        'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                             'servers'  : [ '192.168.1.12', '192.168.1.13'  ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                             'query_dcs'    : True\n}}\n
    "},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"1.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

    Providers :

    The provider is formated as a dictionnary

    { 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The ldapconfig is a dictionnary.

    For example :

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.8.195' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
    "},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True ldap_protocol string protocol type. ldap or ldaps for LDAP directory services ldap tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap_protocol is set to ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"

    You should have all read and done the hands-on :

    • Setup abcdesktop.io in docker mode
    • Edit your configuration file in docker mode
    "},{"location":"1.0/config/authexplicit-ldap/#openldap-docker-image-for-testing","title":"OpenLDAP Docker Image for testing","text":"

    To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.

    Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

    "},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"

    Update the docker-compose.yml file to add an ldap as directory server

    The specific openldap section is describe as a service. The new complete docker-compose.yml file is now :

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\n  openldap:\n    image: abcdesktopio/oc.openldap\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
    "},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

    Update the od.config configuration file.

    Add the explicit entry to the dictionary authmanagers.

    authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}\n\n\n

    Note: the config_ref is ldapconfig.

    Add a new dictionnary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'openldap' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n

    Note: the server name is the name of the service entry

    Save your new od.config file.

    The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.

    docker-compose restart

    Open the URL:http://localhost

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"1.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-docker-image-for-testing","title":"The LDAP structure of OpenLDAP Docker Image for testing","text":""},{"location":"1.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"1.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"1.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"1.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"1.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"1.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"1.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"1.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"1.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"1.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"1.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"1.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

    Configuration sample for Microsoft Active Directory

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
    "},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"1.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

    "},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"1.0/config/authexternal/","title":"Authentification external","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"1.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"1.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

    'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
    "},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
    "},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"1.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionnary object and contains an anononymous provider.

    anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anononymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionnary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Press the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command docker ps -a

    docker ps -a\n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When the anonymous container is removed, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

    The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

    By default others controllers access is enabled, without ip restriction.

        controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

    If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"

    Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.

    • In Kubenetes Mode: Read the setup guide, to make change in the abcdesktop yaml file. Setup and configuration guide for kubernetes abcdesktop

    • In Docker Mode : Read the following chapter

    This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.

    "},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • The docker-compose command ready to run
    "},{"location":"1.0/config/editconfig/#download-sample-configuration-file","title":"Download sample configuration file","text":"

    Create a directotry named abcdesktop in your home directory.

    cd\nmkdir -p abcdesktop\n

    To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config where docker-compose.yml file is located.

    Download sample configuration file od.config then rename the od.config.reference file as od.config

    "},{"location":"1.0/config/editconfig/#stop-your-docker-compose","title":"Stop your docker-compose","text":"
     docker-compose down\n

    You should read on the standart output

    Removing open_nginx_1     ... done\nRemoving open_pyos_1      ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1   ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
    "},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml","text":"

    Edit your docker-compose.yml to add a volumes entry to pyos services

    Example : My working directory is /home/alex/abcdesktop

    Add the new entry in volumes

     volumes:\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n

    For example, the docker-compose.yml contains

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
    "},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    Now, it's time to make a change in your od.config file.

    Download the od.config file and save it to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n

    Change the defaultbackgroundcolors in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local oc.config file.

    Run your docker-compose

    To restart your docker-compose, run the command

     docker-compose up\n

    When the od.config change, od.py reload this configuration file automatically.

    You should read at the standard ouput of docker-compose

    Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1   ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1  ... done\nStarting abcdesktop_pyos_1      ... done\nStarting abcdesktop_nginx_1     ... done\n[ lines cut here ]\n
    "},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"

    Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colors and you should have it as background color :

    Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.

    "},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"1.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"1.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"1.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"1.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"1.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"1.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"1.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"1.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"1.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"1.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"1.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"1.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"1.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    {\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite\n
    "},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
    "},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"

    Click on the Docker icon in MacOS/X menu bar.

    Then choose Preferences...

    The following window should appear :

    Choose Kubernetes, then check the Enable Kubernetes

    Kubernetes stay in Starting state during few minutes. Please wait to download all container images and for kubernetes installation process.

    On the bottom you should read next Docker Running Kubernetes Running

    Great, you have installed Kubernetes on MacOS/X.

    "},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

    Open a Terminal, then run the command kubectl version

    % kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

    Run the command kubectl get pods

    % kubectl get pods\nNo resources found.\n

    Great, the kubectl command works. It's time to deploy abcdesktop.io

    "},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"

    Click on the Docker Desktop icon in the windows tray.

    The following menu should appear, choose Settings :

    The following window should appear :

    Choose Kubernetes, then check the Enable Kubernetes

    Press the Apply and Restart button. Please wait to download all container images and for kubernetes installation process.

    On the bottom you should read next Docker Running and Kubernetes Running.

    Great, you have installed Kubernetes on Windows 10.

    "},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

    Open a Terminal cmd.exe, then run the command kubectl version

    Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

    Run the command kubectl get pods

    kubectl get pods\nNo resources found.\n

    Great, the kubectl command works. It's time to deploy abcdesktop.io

    "},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"

    This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.

    Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.

    To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"

    Here are officials available encryption providers (Kubernetes Official page ):

    Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther ConsiderationsidentityNoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbcAES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox.secretboxXSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcmAES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kmsUses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user.

    aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"

    In /etc/kubernetes directory, create a directory named aescbc:

    sudo mkdir /etc/kubernetes/aescbc\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"

    Create aescbc yaml configuration file:

    sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
    apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n  - resources:\n    - secrets\n    providers:\n    - aescbc:\n        keys:\n        - name: key1\n          secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n    - identity: {}\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"

    Secret key can be generated using the following command:

    head -c 32 /dev/urandom | base64\n

    In encrypt_config.yaml, replace secret for key1 in aescbc.keys section

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"

    As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:

    sudo chmod -R 600 /etc/kubernetes/aescbc\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"

    Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"

    Edit kube-apiserver.yaml configuration file:

    vim /etc/kubernetes/manifests/kube-apiserver.yaml\n

    In spec.containers.command section add:

        - --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n

    In spec.containers.volumeMounts section add:

        - mountPath: /etc/kubernetes/aescbc\n      name: aescbc-config\n      readOnly: true\n

    In spec.volumes section add:

      - hostPath:\n      path: /etc/kubernetes/aescbc\n      type: DirectoryOrCreate\n    name: aescbc-config\n

    save the file

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"

    When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:

    kubectl -n kube-system get pods\n
    NAME                             READY   STATUS    RESTARTS   AGE\ncoredns-66bff467f8-69b8r         1/1     Running   0          21h\ncoredns-66bff467f8-74j9n         1/1     Running   0          21h\netcd-cube05                      1/1     Running   0          21h\nkube-apiserver-cube05            1/1     Running   0          6s\nkube-controller-manager-cube05   1/1     Running   1          21h\nkube-flannel-ds-amd64-p9xhq      1/1     Running   0          20h\nkube-proxy-8xk5g                 1/1     Running   0          21h\nkube-scheduler-cube05            1/1     Running   1          21h\n

    At this state, all created secrets will be crypted in etcd

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"
    kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"
    sudo kubectl -n default describe secret secret1\n
    Name:         secret1\nNamespace:    default\nLabels:       <none>\nAnnotations:  <none>\n\nType:  Opaque\n\nData\n====\nmykey:  6 bytes\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"

    To verify secret encryption we will install etcd client package

    apt-get install etcd-client\n

    Run the following command:

    ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n

    Output will appear with the following text k8s:enc:aescbc:v1:key1: followed by binary values.

    Secrets are now encoded with aescbc v1 provider using key1

    "},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • An access to the github website to run git clone command
    • An access to the bintray.com website to download a file

    AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:

    "},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"

    noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.

    "},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"

    noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:

    • Chrome 49, Firefox 44, Safari 11, Opera 36, IE 11, Edge 12
    "},{"location":"1.0/setup/novnc/#features","title":"Features","text":"
    • Supports all modern browsers including mobile (iOS, Android)
    • Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
    • Supports scaling, clipping and resizing the desktop
    • Local cursor rendering
    • Clipboard copy/paste
    • Translations
    • Licensed mainly under the MPL 2.0, see the license document for details
    "},{"location":"1.0/setup/novnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

    Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

    docker volume create myshared \n
    "},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

    Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.

    • The tcp port 6081 will be use later by ws2tcp nodejs server.
    • The volume myshared is mounted to /tmp

    Note: We do not need the default 5900 VNC tcp port any more.

    docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n

    You should see a prompt like :

    root@6de36e574877:/#\n

    Install the package wget Install the library files for tigervnc.

    Package list:

    • libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable

    Those packages are used by tigervnc. We need to install them.

    apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n

    Download the last tigervnc X11 graphics server from the bintray.com web site

     wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n

    Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system

    cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n

    Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section

    Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n

    You should read the output

    Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar  3 11:05:48 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext:      created VNC server for screen 0\n

    Check that the Xvnc TigerVNC release is 1.10.0.

    Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.

    "},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"

    ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.

    ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.

    Before, install the package gcc g++ make curl

    apt-get install -y gcc g++ make curl \n

    Install nodejs and npm

    curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
    apt-get install -y nodejs\n

    Install ws-tcp-bridge

    npm install ws-tcp-bridge -g\n

    Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background

    Add the & at the end of the command line to run this process in background

    /usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n

    You should read on the standard output

    proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n

    Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket

    "},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"

    On the container myx11server, to get the container local IP Address, install the package net-tools package

    apt-get install -y net-tools\n

    And run the ifconfig command

    ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 172.17.0.2 netmask 255.255.0.0  broadcast 172.17.255.255\n        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)\n        RX packets 65149  bytes 95569807 (95.5 MB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 20880  bytes 1159982 (1.1 MB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n

    Write here the ip address of your container myx11server:

    IP Address of myx11server _ . . _ .

    "},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"

    Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.

    docker run -it --name mywebserver -p 80:80 ubuntu:latest\n

    You should see a prompt like:

    root@96df62a73e4f:/# \n

    Install nginx webserver, run the command

    apt-get update\napt-get install -y nginx-extras\n

    Install the git and vim package, run the command

    apt-get install -y git vim\n

    Clone the novnc git on github.com, inside the nginx's root directory.

    cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n

    You should read on the standart output

    Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n

    Start the nginx web server

    nginx\n

    The web server nginx is running in backgound.

    Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.

    "},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"

    Install the ping command, run the command

    apt-get install -y iputils-ping\n

    Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address

    ping -c 5 xxx.xxx.xxx.xxx\n

    In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2

    ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n

    The container webserver should receive package from the myx11server container

    "},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"

    Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.

    vim /etc/nginx/sites-enabled/default\n

    In the server section, after the line location you should found :

        location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n

    Add a /websockify route to proxyfied the websocket http request to your myx11server container.

        location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass                       http://XXX.XXX.XXX.XXX:6081/;\n    }\n

    You have to replace the line

    proxy_pass       http://XXX.XXX.XXX.XXX:6081/;\n

    by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/

    proxy_pass       http://172.17.0.2:6081/;\n

    The complete server section in the nginx file is for example

    server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    # SSL configuration\n    #\n    # listen 443 ssl default_server;\n    # listen [::]:443 ssl default_server;\n    #\n    # Note: You should disable gzip for SSL traffic.\n    # See: https://bugs.debian.org/773332\n    #\n    # Read up on ssl_ciphers to ensure a secure configuration.\n    # See: https://bugs.debian.org/765782\n    #\n    # Self signed certs generated by the ssl-cert package\n    # Don't use them in a production server!\n    #\n    # include snippets/snakeoil.conf;\n\n    root /var/www/html;\n\n    # Add index.php to the list if you are using PHP\n    index index.html index.htm index.nginx-debian.html;\n\n    server_name _;\n\n    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n\n    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass           http://172.17.0.2:6081/; # change this line \n    }\n\n\n    # pass PHP scripts to FastCGI server\n    #\n    #location ~ \\.php$ {\n    #   include snippets/fastcgi-php.conf;\n    #\n    #   # With php-fpm (or other unix sockets):\n    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n    #   # With php-cgi (or other tcp sockets):\n    #   fastcgi_pass 127.0.0.1:9000;\n    #}\n\n    # deny access to .htaccess files, if Apache's document root\n    # concurs with nginx's one\n    #\n    #location ~ /\\.ht {\n    #   deny all;\n    #}\n}\n

    Now, it's time to reload your nginx configuration, by running the command

    nginx -s reload\n
    "},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"

    Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.

    Go to the URL http://localhost or the ip address of your own server

    In this exercice in use localhost in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name of your own server.

    http://localhost\n

    or

    http://YOUR_SERVER_IP_ADDRESS\n

    You should read the Welcome to nginx! message in your web browser

    Go to the noVNC URL http://localhost/noVNC/vnc.html

    http://localhost/noVNC/vnc.html\n

    Remember, remplace localhost by your fully qualified domain name if need

    You should read the Welcome to nginx! message in your web browser

    To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:

    • The Encrypt is not checked
    • Set the Host as localhost (or your host ip address where your contianers are running )
    • Set the Port to 80
    • Set the Path to /websockify

    Then, press the Connect Button

    "},{"location":"1.0/setup/novnc/#install-libreoffice-as-a-docker-application","title":"Install libreoffice as a docker application","text":"

    On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.

    docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install libreoffice application, run the install libreoffice command in your mylibreoffice container.

    apt-get update\napt-get install -y libreoffice\n

    Run the soffice command to start Libreoffice

    export DISPLAY=:0.0\nsoffice --writer\n

    You should read the output

    (soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n

    On the web browser, the application Libreoffice Writer should appear.

    Type some text data like 'Hello, I am running inside a docker container'

    "},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

    To move, resize, close, the windows applications, we need a windows manager. abcdesktop is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

    Run the install openbox command in your myx11server container.

    apt-get install -y openbox\n

    Set the DISPLAY environment variable to :0.0 and start openbox in background

    export DISPLAY=:0.0\nopenbox &\n

    Now, you can move the Libreoffice windows. All windows are decorated.

    Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice

    "},{"location":"1.0/setup/retrieve_all_images/","title":"Get all applications for abcdesktop","text":"

    Lot of application are ready to use for abcdesktop. All applications are opensource.

    You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.

    docker pull abcdesktopio/$APP.d\n

    for example to download libreoffice calc, run the command

    docker pull abcdesktopio/calc.d\n

    Read the list of all applications on the application list page

    "},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"

    Go to the abcdesktop directory (where the docker-compose.yml is located), and run the bash commands :

    echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\"  | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n

    Great, you have uninstalled abcdesktop in non-cluster hosts.

    "},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"

    The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.

    "},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • A VNC Client
    • An access to the docker public registry
    • An access to the ubuntu repository
    "},{"location":"1.0/setup/vnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

    Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

    docker volume create myshared \n
    "},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

    Start the first graphical container named myx11server, forward the tcp port 5900 to the container.

    • The tcp port 5900 will be use later by the vnc server.
    • The volume myshared is mounted to /tmp
    docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n

    You should see a prompt like :

    root@6de36e574877:/#\n

    Install the X11 graphics server tigervnc

    apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n

    Start the X11 graphics server tigervnc

     Xvnc :0 -SecurityTypes=none &\n

    You should read the output

    Xvnc TigerVNC 1.7.0 - built Dec  5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar  2 11:43:56 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on all interface(s), port 5900\n vncext:      created VNC server for screen 0\n

    Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.

    We will use the host tcp port 5900 to connect VNC Client.

    "},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"

    From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/

    Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.

    Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.

    This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue button.

    This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.

    You need to confirm the uncrypted connection warning dialog box. Press the Continue button.

    A black screen should appear :

    Keep this VNC Client running, we will use this display to show our applications later.

    "},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"

    On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.

    docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install standart application like xedit, xman or xeyes, install the package x11-apps.

    Run those commands in your myx11server container.

    apt-get update\napt-get install -y x11-apps\n

    Set the DISPLAY environment variable to :0.0 and then start the xedit command.

    export DISPLAY=:0.0\nxedit\n

    On the VNC Viewer, the application xedit should appear.

    Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.

    "},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

    To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

    Run the install openbox command in your myx11server container.

    apt-get install -y openbox\n

    Set the DISPLAY environment variable to :0.0 and then start openbox.

    export DISPLAY=:0.0\nopenbox\n

    The Openbox message appear to the sdterr

    Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n

    Now, you can move the window xedit. The windows are decorated.

    "},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"

    Activate the window shell with your myapp running container, and press CTRL+C

    root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n

    You can remove your docker container, to clean up your environment

    docker rm myapp\n
    "},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"

    On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.

    docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install firefox application, run the install firefox command in your myfirefox container.

    apt-get update\napt-get install -y firefox\n

    Run the firefox command

    export DISPLAY=:0.0\nfirefox\n

    You should read the output

    \n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n

    On the VNC Viewer, the application firefox should appear.

    Check that firefox works and go to your favorite web site.

    "},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"

    To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared

    Run the commands :

    docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n

    Keep the docker images ubuntu, we will use it in the next chapter

    "},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"

    In the next chapter, we will replace the VNC Client by a web browser.

    "},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"

    The abcdesktop release 2.0 has started in May 2020

    • docker instance version 18 and above.
    • abcdesktop (pyos) need a dockerd socket access.
    • Kubernetes release less or equal than 1.23.7-00 (if you use kubernetes release 1.24 or above, you must use abcdesktop release 3.0)
    • an application runs as docker container or as kubernetes pod
    • abcdesktop release 2.x is stable
    "},{"location":"2.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"2.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"2.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"2.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"2.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

    For example :

    'explicit': {\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description default_domain string set the default domain name, if user does not prefix the login by domain\\s. default_domain is only used by Active Directory provider providers dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref.

    The provider is formatted as a dictionary. Example for a provider defined as planet

     { 'planet': {  \n            'config_ref': 'ldapconfig',  \n            'enabled': True  \n        }\n }\n
    Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet', where key is config_ref and value is the dictionary variable name. enable boolean True to enable or False to disable the provider configuration

    The ldapconfig is a dictionary.

    For example :

    ldapconfig : { \n  'planet': {    \n    'default'       : True, \n    'ldap_timeout'  : 15,\n    'ldap_protocol' : 'ldap',\n    'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://192.168.8.195' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n  } \n } \n}\n
    "},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only boolean Do not run ldap queries, only use to run authentication False auth_type string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap or ldaps for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ] LDAP server address IP Address or FQDN value scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) serviceaccount dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"

    Ldap service account permits service account binding. A service account can be defined using clear text login and password data, or as file reference login and password starting by file://.

    • If login starts by file://, then pyos open the defined file to read login data.
    • If password starts by file://, then pyos open the defined file to read password data.

    The file reference file:// for login and password is used to read kubernetes secret file data.

    "},{"location":"2.0/config/authexplicit-ldap/#configure-auth-using-the-openldap-container","title":"Configure Auth using the OpenLDAP container","text":""},{"location":"2.0/config/authexplicit-ldap/#openldap-container-for-testing","title":"OpenLDAP container for testing","text":"

    To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.

    Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

    "},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

    Update the od.config configuration file.

    Add the explicit entry to the dictionary authmanagers.

    authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}      \n

    Note: the config_ref is ldapconfig.

    Add a new dictionary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

    ldapconfig : { 'planet': {    \n                        'default'       : True, \n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://openldap' ] }}\n

    Save your new od.config file.

    Open the URL:http://localhost:30443

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"2.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-container-for-testing","title":"The LDAP structure of OpenLDAP container for testing","text":""},{"location":"2.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"2.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"2.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"2.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"2.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"2.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"2.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"2.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"2.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"2.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"2.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"2.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

    The explicit provider support the directory services ldap, ldaps, and Microsoft Active Directory, and SIMPLE, NTLM and KERBEROS protocols.

    Configuration sample for Microsoft Active Directory with KERBEROS protocol :

    'explicit': {\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'auth_type'     : 'KERBEROS'\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ 'ldap://192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
    "},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"2.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP explicit authmanagers

    "},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"2.0/config/authexternal/","title":"Authentification external","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"2.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"2.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

    'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
    "},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
    "},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"2.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easiest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionary object and contains an anonymous provider.

    anonymous provider always permits authentification, and create a uuid as userid. anonymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anonymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Select the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command

    kubectl get pods -n abcdesktop \n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When an anonymous user close his session, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"2.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

    The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

    'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

    The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

    A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

    coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

    Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

    For example :

    description: AD\\john\n

    Then pyos look for provider AD configuration and process authentification on domain AD

    The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

    A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

    "},{"location":"2.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

    The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

    authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
    "},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

    metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

    The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

    The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

    To get more information about foreign security principal (FSP), read :

    • Foreign Security Principals Container

    • Active Directory: Foreign Security Principals and Special Identities

    "},{"location":"2.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

    The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

    By default others controllers access is enabled, without ip restriction.

        controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

    If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"

    The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode or in kubernetes mode.

    "},{"location":"2.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

    All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

    Option name Type Sample desktop.usex11unixsocket boolean True desktop.defaultbackgroundcolors list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype string 'volume' desktop.remotehomedirectorytype list [] desktop.persistentvolumeclaim string None desktop.allowPrivilegeEscalation boolean False desktop.securityopt list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret string None desktop.image string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer boolean False desktop.soundimage string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer boolean False desktop.usecontainerimage boolean False desktop.initcontainerimage string 'abcdesktopio/oc.busybox' desktop.envlocal dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' } desktop.nodeselector dictionary {} desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon' desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.host_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] } desktop.application_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] } desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 } desktop.webhookdict dictionary { 'firewall': '192.168.7.1' }"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"

    The desktop.usex11unixsocket force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0

    • If this feature is enable: A container application need a the DISPLAY. The DISPLAY is in this case :0.0. The container application and the oc.user container share the same volume /tmp, and share the X11 unix socket is /tmp/.X11-unix/X0.

    • If this feature is disable: A container application need a DISPLAY. The DISPLAY is :0.0 (don't think at IPADDRESS_OF_X11_SERVER:0.0 to protect X11 access control). The two containers share the same network stack by default. The X11 server NEED to listen to a TCP or UDP port.

    You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.

    TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.

    Set the desktop.usex11unixsocket value to True in most case, and this should not be changed.

    "},{"location":"2.0/config/desktop/#desktopshareipcnamespace","title":"desktop.shareipcnamespace","text":"

    The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application

    Value Description '' Use daemon\u2019s default. 'none' Own private IPC namespace, with /dev/shm not mounted. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system\u2019s IPC namespace.

    If not specified, daemon default is used, which can either be 'private' or 'shareable', depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.

    Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.

    If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".

    Default value desktop.shareipcnamespace : 'shareable'

    "},{"location":"2.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

    This option describes how the default home directory for user user ballon should be created :

    • None: no dedicated volume is created, the oc.user container use a directory inside the container. All user data will be removed at logout.
    • 'volume': This value is only recommended in docker mode. 'volume'option create a dedicated volume, the oc.user container and applications may share this volume. User home data are persistent.
    • 'persistentVolumeClaim': This value is only avalaible in kubernetes. PersistentVolumeClaim option use a persistentVolumeClaim to create the user home directory. The persistentVolumeClaim can be mapped to differents storage data (like NFS, iSCSI, RBD...). Read more about persistentVolumeClaim on the kubernetes.io website. You need the set the value of desktop.persistentvolumeclaim or create a default Persistent Volume Claim named 'abcdesktop-pvc'
    "},{"location":"2.0/config/desktop/#desktoppersistentvolumeclaim","title":"desktop.persistentvolumeclaim","text":"

    This value is only avalaible in kubernetes mode.

    desktop.persistentvolumeclaim is the name of the Persistent Volume Claim if the desktop.homedirectory is set to 'persistentVolumeClaim'. The PVC (Persistent Volume Claim) must exist.

    Run the kubectl get pvc command to list the persistent volume claim

    NAME                                   STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS           AGE\nabcdesktop-pvc                        Bound    abcdesktop-pv             5Gi        RWO            abcdesktop-standard   170d\n
    "},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

    desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

    For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

    If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

    "},{"location":"2.0/config/desktop/#desktopallowprivilegeescalation","title":"desktop.allowPrivilegeEscalation","text":"

    The desktop.allowPrivilegeEscalation option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.

    The default value is False You should only set desktop.allowPrivilegeEscalation to run sudo command.

    In production this value MUST be set to False

    "},{"location":"2.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

    The desktop.defaultbackgroundcolors allow you to change the default background color.

    The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

    The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

    Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    You should see the default background colors, for example :

    "},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"

    The desktop.imagePullSecret is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.

    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with the docker hub.
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with your own privateregistry
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    "},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"

    The desktop.image is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04

    "},{"location":"2.0/config/desktop/#desktopprinterimage","title":"desktop.printerimage","text":"

    The desktop.printerimage is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04

    "},{"location":"2.0/config/desktop/#desktopuseprintercontainer","title":"desktop.useprintercontainer","text":"

    The desktop.useprintercontainer is boolean, to use printer cupsd service as an separated container. This value is only available in kubernetes mode. The default value is False.

    "},{"location":"2.0/config/desktop/#desktopsoundimage","title":"desktop.soundimage","text":"

    The desktop.soundimage is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04

    "},{"location":"2.0/config/desktop/#desktopusesoundcontainer","title":"desktop.usesoundcontainer","text":"

    The desktop.usesoundcontainer is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False.

    "},{"location":"2.0/config/desktop/#desktopuseinitcontainer","title":"desktop.useinitcontainer","text":"

    The desktop.useinitcontainer is boolean, to use init container. The default value is False. The code call the desktop.initcontainercommand list .

    The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.

    /home/balloon must belong to balloon default user and balloon default group.

    "},{"location":"2.0/config/desktop/#desktopinitcontainercommand","title":"desktop.initcontainercommand","text":"

    The desktop.initcontainercommand runs the command at init container. The default value is None, the default type is list.

    desktop.initcontainercommand example :

    desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n

    This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096).

    "},{"location":"2.0/config/desktop/#desktopinitcontainerimage","title":"desktop.initcontainerimage","text":"

    The desktop.initcontainerimage is the name of the init container image. The default value is busybox.

    "},{"location":"2.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

    desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

    The default value is :

    { \n        'DISPLAY': ':0.0', \n        'USER': 'balloon', \n        'LIBOVERLAY_SCROLLBAR': '0',\n        'WINEARCH': 'win32',\n        'UBUNTU_MENUPROXY': '0',\n        'HOME': '/home/balloon',\n        'LOGNAME': 'balloon',\n        'PULSE_SERVER: '/tmp/.pulse.sock', \n        'CUPS_SERVER': '/tmp/.cups.sock' \n}\n

    Add 'CUPS_SERVER: '/tmp/.cups.sock' only if desktop.useprintercontainer is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock' only if desktop.usesoundcontainer is True.

    "},{"location":"2.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

    desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

    { 'disktype': 'ssd' }\n
    "},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"

    desktop.username describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

    desktop.userid describes the uid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

    desktop.groupid describes the gid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    RUN groupadd --gid 4096 $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

    desktop.userhomedirectory describes the homedirectory of the user created inside the oc.user container. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

    The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

    "},{"location":"2.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

    The desktop.policies is a dictionary.

    Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } acl allow or denied desktop creation

    Example

    desktop.policies: { 'rules':\n    { 'volumes': \n        { 'domainuser':  \n            { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n            'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n            } \n        },\n      'acls' : {},\n      'max_app_counter' : 4  }\n
    "},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"

    Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config

    Define how the application can be run, read host_config description page to get more informations

    "},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"

    Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config

    Define how the oc.user container can be run, read host_config description page to get more informations

    "},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

    desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

    "},{"location":"2.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"2.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

    WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

    desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

    Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

    If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

    To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

    kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
    "},{"location":"2.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

    The pyos core service configuration file name is od.config

    "},{"location":"2.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n
    "},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"

    Change the defaultbackgroundcolors option in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local file od.config.

    "},{"location":"2.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

    "},{"location":"2.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
    kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
    "},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

    To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colour and you should have it as background colour :

    Great, you can easily update your configuration file od.config.

    "},{"location":"2.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"2.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"2.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"2.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"2.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"2.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"2.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"2.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"2.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"2.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"2.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"2.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"2.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"2.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"2.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    {\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite\n
    "},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
    "},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"

    The abcdesktop release 3.0 has started in May 2022

    • Kubernetes release greater or equal to 1.24
    • No depend to docker, an application runs as pod or as an ephermeral container
    • All container-runtimes are supported. containerd is recommended by default
    • abcdesktop release 3.x is unstable, API endpoints can change.
    "},{"location":"3.0/features/#architecture-abcdesktop-30","title":"Architecture abcdesktop 3.0","text":"

    In release 3.0, the abcdesktop control plane uses only Kubernetes API. It doesn't depend to dockerd.

    "},{"location":"3.0/features/#auth-service","title":"Auth service","text":"

    Auth service supports LDAP Posix Account

    "},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"

    Application can run as :

    • kubernetes pod
    • kubernetes ephemeral container
    "},{"location":"3.0/features/#volumes","title":"Volumes","text":""},{"location":"3.0/features/#users-home-directories","title":"User's home directories","text":"

    Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath on each worker node or as persistentVolumeClaim. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/","title":"application runtime Ephemeral container and Pod","text":"

    An abcdesktop application can run as a kubernetes ephemeral container or as a pod.

    An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container does not prevent cpu and memory resource limits.

    A pod can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod, you can specify resource limits.

    To describe the difference between ephemeral-container and pod-application, we use the game 2048, one instance come from alpine based on gtk, the second one come from ubuntu based on qt

    • 2048-alpine is a GTK application, and is defined to run as ephemeral-container
    • 2048-ubuntu is a QT application, and is defined to run as a kubernetes pod
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#requirements","title":"Requirements","text":"
    • jq command preinstalled.
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-a-shell-to-your-abcdesktop-server","title":"Start a shell to your abcdesktop server","text":"

    Get a shell to your abcdestkop server.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download 2048-alpine and 2048-ubuntu json files","text":"

    Open a shell to your abcdesktop server

    curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n

    Check that the json files are downloaded

    $ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n

    Look at the label oc.containerengine for each json file

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"
    cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

    The response is ephemeral_container

    ephemeral_container\n

    This application 2048-alpine will start as an ephemeral_container

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine_1","title":"Read the label oc.containerengine for 2048-alpine","text":"
    cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

    The response is pod_application

    pod_application\n

    This application 2048-ubuntu will start as a pod_application, it's a pod.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-and-2048-ubuntu-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine and 2048-ubuntu applications to your abcdesktop service","text":"
    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n

    Each curl command returns a complete json document.

    Wait for the pull pod are Ready

    kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n

    Wait for condition met

    pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

    http://localhost:30443\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"

    Login in as the user Hermes Conrad

    • Login: Hermes Conrad
    • Password: hermes

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created","title":"Your desktop is created","text":"

    Your desktop is created. By default your dock is empty.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"

    In the search text area, write the keyword 2048

    The two applications appear in the search result applications area.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"

    Start 2048-ubuntu and 2048-alpine application

    2048-ubuntu and 2048-alpine applications start. The application 2048-alpine can start quickly than the application 2048-ubuntu.

    • 2048-alpine is an ephemeral container attached to the graphical container.
    • 2048-ubuntu is a complete kubernetes pod.
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#lets-have-a-look-on-your-server-side","title":"Let's have a look on your server side","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#get-pod-application","title":"Get pod application","text":"

    Get the running pod using kubectl get pods -n abcdesktop

    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nhermes-app-2048-ubuntu-4dd6f    1/1     Running   0          8s\nhermes-db906                    4/4     Running   0          100s\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          38m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          38m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          25m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          38m\npyos-od-5586b88767-gsdl8        1/1     Running   0          14m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          38m\n

    The application 2048-ubuntu is listed as a pod. The application 2048-ubuntu is a pod. The prefix is the $userid-app for example hermes-app-2048-ubuntu-4dd6f, followed by the application name 2048-ubuntu and a uuid.

    The application 2048-alpine is not a pod.

    The application 2048-alpine is listed as an ephemeral container, inside the user pod hermes-db906

    kubectl get pods hermes-db906  -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n

    The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses

    [\n  {\n    \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n    \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n    \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n    \"lastState\": {},\n    \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n    \"ready\": false,\n    \"restartCount\": 0,\n    \"state\": {\n      \"terminated\": {\n        \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n        \"exitCode\": 0,\n        \"finishedAt\": \"2023-05-17T14:38:13Z\",\n        \"reason\": \"Completed\",\n        \"startedAt\": \"2023-05-17T14:37:00Z\"\n      }\n    }\n  }\n]\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"

    An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the X11 server.

    A pod can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.

    If your application need to share memory with X11 server, when you have to set the oc.containerengine label to ephemeral_container.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#compare-kubernetes-ephemeral-container-and-pod","title":"Compare kubernetes ephemeral container and pod","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-ephemeral-container","title":"Kubernetes ephemeral container","text":"

    Use an ephemeral container to start an application have some advantages and some disadvantages.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":"
    • Start quickly
    • Less system resources than a pod
    • Share Process Namespace is allowed shareProcessNamespace: true
    • Share memory shm is allowed
    • Share the network stack (IP Address) of the user pod
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages","title":"disadvantages","text":"
    • resources is disallowed
    • no limits and requests (cpu, memory)
    • nodeSelector not supported
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-pod","title":"Kubernetes Pod","text":"

    Use a kubernetes pod to start an application have some advantages and some disadvantages.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":"
    • resources (cpu, memory) is allowed
    • limits and requests are supported
    • ports, livenessProbe, readinessProbe are allowed
    • nodeSelector support an application can run on a dedicated node (for example with GPU)
    • can use a dedicated network to route application data
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages_1","title":"disadvantages","text":"
    • More system resources than an ephemeral container
    • Need X11 tcp port enabled on the user pod 'X11LISTEN': 'tcp'
    • Increase network resource if application pod and user pod run a distinct host
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting","title":"Troubleshooting","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-badshmseg-error","title":"Troubleshooting BadShmSeg error","text":"

    If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"
    curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error applications to your abcdesktop service","text":"
    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n

    Wait for the pulled pod are Ready

    kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n

    Wait for condition met

    pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n

    Login to your abcdesktop service

    Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

    http://localhost:30443\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"

    Login in as the user Hermes Conrad

    • Login: Hermes Conrad
    • Password: hermes

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created_1","title":"Your desktop is created","text":"

    Your desktop is created. By default your dock is empty.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"

    In the search text area, write the keyword 2048

    The three applications appear in the search result applications area.

    Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.

    In the abcdesktop menu, choose Settings |\u00a0Tasks.

    Then select the Logs button. The error was 'BadShmSeg (invalid shared segment parameter)'.

    (org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n

    If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM value to 1.

    QT_X11_NO_MITSHM=1 \n

    Note your can also use QT_XCB_NO_MITSHM value to 1

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-chromium-application","title":"Troubleshooting chromium application","text":"

    For chromium application disabled shm-usage with the parameters --disable-dev-shm-usage

    • disable-dev-shm-usage get more informations about the dev shm usage and all chromium parameters

    • no-sandbox: get more informations about the no-sandbox parameters.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-cannot-open-display-or-could-not-connect-to-display-error","title":"Troubleshooting cannot open display or could not connect to display error","text":"

    When you start an application the log file write cannot open display error

    kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba  -n abcdesktop \n
    qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n

    Using the web shell inside an abcdesktop session, start netstat -a command line

    The result should show that the process Xvnc is listening on tcp port number 6000

    hermes:~$ netstat  -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      82/Xvnc               \n

    If Xvnc is not listening on tcp port number 6000

    Update od.config to make Xvnc listen on tcp port number 6000

    Open your od.config file, and look at the desktop.envlocal option.

    Add 'X11LISTEN': 'tcp' to the dictionary :

    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n                        'X11LISTEN'             : 'tcp' }\n

    Save your local od.config file.

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Then restart pyos pod

    kubectl delete pod -l run=pyos-od -n abcdesktop\n

    You should read on stdout

    pod \"pyos-od-5586b88767-mrf28\" deleted\n
    "},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":"
    • ctr command preinstalled .
    • nodejs and npm command preinstalled.
    • docker command preinstalled.
    "},{"location":"3.0/application/createsampleapplication/#goals","title":"Goals","text":"
    • Create a sample application xterm. xterm program is a terminal emulator for the X Window System.
    "},{"location":"3.0/application/createsampleapplication/#git-clone-application-repository","title":"git clone application repository","text":"

    The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps

    git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

    And install nodejs packages for oc.apps

    npm install\n
    "},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"

    abcdesktop uses a json file description to build an application.

    Create a sample.json file

    {\n  \"tag\": \"3.0\",\n  \"acl\": { \"permit\": [ \"all\" ] },\n  \"cat\": \"development\",\n  \"icon\": \"small.svg\",\n  \"apkpackage\": \"xterm\",\n  \"keyword\": \"xterm,shell,cmd\",\n  \"launch\": \"xterm.XTerm\",\n  \"name\": \"Xterm\",\n  \"path\": \"/usr/bin/xterm\",\n  \"rules\": { \"homedir\": { \"default\": true } },\n  \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
    "},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile from the sample.json file","text":"

    make.js is a command line for abcdesktop. make.js read a json file and create a Dockerfile

    The make.js options are :

    • -r 3.0 : to build image in abcdesktop 3.0 format
    • -d True : to create a Dockerfile as output
    • -f sample.json: file to read as input

    npm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities

    node make.js -r 3.0 -d True  -f sample.json\n

    Your read on stdout.

    Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n  acl: { permit: [ 'all' ] },\n  cat: 'development',\n  icon: 'small.svg',\n  apkpackage: 'xterm',\n  keyword: 'xterm,shell,cmd',\n  launch: 'xterm.XTerm',\n  name: 'Xterm',\n  path: '/usr/bin/xterm',\n  rules: { homedir: { default: true } },\n  template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n

    Read the Dockerfile

    cat Dockerfile\n
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
    "},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0 from Dockerfile","text":"
    docker build -t abcsample:3.0 .\n
    Sending build context to Docker daemon  44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
    "},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0","text":"

    abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.

    In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.

    Export the image to OCI image format

    docker save abcsample:3.0 -o abcsample.tar\n

    Import abcsample into the namespace k8s.io using ctr

    ctr -n k8s.io images import abcsample.tar\n
    unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
    "},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0 in to abcdesktop","text":"

    Export the abcsample:3.0 image to OCI format

    docker image inspect abcsample:3.0 > abcsample.json\n

    Import the abcsample.json into abcdesktop endpoint /API/manager/image

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n

    Return a json document

    [\n  {\n    \"home\": null,\n    \"cmd\": [\n      \"/composer/appli-docker-entrypoint.sh\"\n    ],\n    \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n    \"id\": \"abcsample:3.0\",\n    \"rules\": {\n      \"homedir\": {\n        \"default\": true\n      }\n    },\n    \"acl\": {\n      \"permit\": [\n        \"all\"\n      ]\n    },\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"Xterm\",\n    \"icon\": \"small.svg\",\n    \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n    \"keyword\": \"xterm,xterm,shell,cmd\",\n    \"uniquerunkey\": null,\n    \"cat\": \"development\",\n    \"args\": null,\n    \"execmode\": null,\n    \"security_opt\": null,\n    \"showinview\": null,\n    \"displayname\": \"Xterm\",\n    \"mimetype\": [],\n    \"path\": \"/usr/bin/xterm\",\n    \"desktopfile\": null,\n    \"executablefilename\": \"xterm\",\n    \"usedefaultapplication\": null,\n    \"fileextensions\": [],\n    \"legacyfileextensions\": [],\n    \"host_config\": {},\n    \"secrets_requirement\": null,\n    \"run_inside_pod\": false,\n    \"image_pull_policy\": \"IfNotPresent\",\n    \"image_pull_secrets\": null\n  }\n]\n
    "},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"

    Open a web browser and go to abcdesktop service url.

    Open a new abcdesktop session.

    Look for your new application xterm

    Start your new application xterm

    The icon of then new application xterm is a green rect. It appears in the dock.

    Logoff to free ressources.

    You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json it describe all json applications for abcdesktop.

    "},{"location":"3.0/application/createsampleapplication/#rebuild-all-images","title":"Rebuild all images","text":"

    To rebuild all application in applist.json, run node make.js -r 3.0

    node make.js -r 3.0\n

    This command has create new '.d' files.

    $ ls *.d\nls *.d\nalpine-2048.d            calculator.d    drawio.d               flare.d          hyper.d       kturtle.d       octave.d        remotedesktopmanager.d  terminal.d     winefile-wine.d  youtube.d\napachedirectorystudio.d  chess.d         edge.d                 frozen-bubble.d  impress.d     leocad.d        onlyoffice.d    rhythmbox.d             terminalpod.d  winemine-wine.d\nastromenace.d            chrome.d        elementary.terminal.d  gcompris.d       inkscape.d    librecad.d      openshift.d     robots.d                tetravex.d     winhelp-wine.d\natom.d                   chromium.d      eog.d                  gedit.d          kalzium.d     mahjongg.d      pinta.d         shotcut.d               thunderbird.d  winscp-wine.d\nbase.d                   citrix.d        evince.d               gelemental.d     kdiamond.d    math.d          planner.d       stellarium.d            ubuntu-2048.d  wireshark.d\nbeekeeperstudio.d        cloudfoundry.d  evolution.d            geogebra.d       kgeography.d  mathwar.d       postman.d       step.d                  vice.d         writer.d\nblender.d                cntlm.d         file-roller.d          gimagereader.d   kigo.d        minecraft.d     putty-unix.d    stress.d                vlc.d          xedit.d\nbless.d                  corsix-th.d     filelight.d            gimp.d           klickety.d    mines.d         putty-wine.d    sublime-text.d          vmmacos.d      xeyes.d\nblobby.d                 dia.d           filezilla.d            gnumeric.d       klotski.d     nautilus.d      qelectrotech.d  supertux2.d             vmrc.d         xman.d\nbrackets.d               doom.d          firefox-esr.d          golly.d          konsole.d     notepad-wine.d  remarkable.d    swell-foop.d            vmubuntu.d     xpad.d\ncalc.d                   draw.d          firefox.d              gretl.d          ksquares.d    notepadqq.d     remmina.d       teams.d                 vscode.d       xterm.d\n

    Each .d file is a Dockerfile

    Run make to build all applications (it can take more than 2 hours)

    make\n
    "},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"3.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"3.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"3.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"

    The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

    Read the Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.

    "},{"location":"3.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

    The authmanagers is defined as a dictionary object :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    The od.config defines four kinds of entries in the authmanagers object :

    • external: use for OAuth 2.0 Authentification
    • explicit: use for LDAP, LDAPS and ActiveDirectory Authentification
    • metaexplicit: use Microsoft Active Directory Trusted relationship, with support of FSP (Foreign Security Principals)
    • implicit: use for Anonymous Authentification and SSL-client certificat
    "},{"location":"3.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external For OAuth 2.0 authentification metaexplicit For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"

    You should have read the hands-on :

    • Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.
    "},{"location":"3.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

    Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit, explicit, and external, as describe :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    Save your new od.config file, and restart the pyos pod

    Start your web browser and open the URL http://localhost:30443

    The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

    Great you can now add some value to authenticate your users.

    "},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit is defined to use a directory service like LDAP. Read the authmanagers explicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-metaexplicit","title":"authmanagers metaexplicit:","text":"

    metaexplicit offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

    external use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.

    "},{"location":"3.0/config/authentification/#authmanagers-sample","title":"authmanagers sample","text":"

    In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.

    You can set a complete authmanagers dictionary as described with external, explicit and implicit

    authmanagers: {\n   'external': {\n    'providers': {\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { \n  'AD': { \n      'default' : True, \n      'ldap_timeout': 15,\n      'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n      'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n      'domain': 'AD',\n      'auth_type': 'KERBEROS',\n      'domain_fqdn': 'AD.DOMAIN.LOCAL',\n      'krb5_conf': '/etc/krb5.conf',\n      'servers'    :  [ 'ldap://192.168.7.12' ],\n      'kerberos_realm': 'AD.DOMAIN.LOCAL',\n      'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n     'auth_protocol' : { \n            'ntlm': True, \n            'cntlm': False, \n            'kerberos': True, \n            'citrix': False, \n            'localaccount': True },\n     'query_dcs' : False } } }\n
    "},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"3.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

    Providers :

    The provider is formated as a dictionnary

    { 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The ldapconfig is a dictionnary.

    For example :

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://192.168.8.195' ],\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
    "},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap server URI starts with ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"3.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"3.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"3.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"3.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"3.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"3.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"3.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"3.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"3.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"3.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"3.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"3.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

    Configuration sample for Microsoft Active Directory

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
    "},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"3.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

    "},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"3.0/config/authexternal/","title":"Authentification external","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"3.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }   \n   }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local is referred to your public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"3.0/config/authexternal/#orange-oauth","title":"Orange OAuth","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

     'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"

    GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.

    "},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"

    Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API

    'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"3.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionnary object and contains an anononymous provider.

    anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anononymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionnary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Press the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command docker ps -a

    docker ps -a\n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When the anonymous container is removed, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"3.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

    The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

    'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

    The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

    A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

    coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

    Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

    For example :

    description: AD\\john\n

    Then pyos look for provider AD configuration and process authentification on domain AD

    The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

    A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

    "},{"location":"3.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

    The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

    authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
    "},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

    metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

    The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

    The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

    To get more information about foreign security principal (FSP), read :

    • Foreign Security Principals Container

    • Active Directory: Foreign Security Principals and Special Identities

    "},{"location":"3.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":"
    • Use cloud provider LoadBalancer service to provide a public ip address using http
    "},{"location":"3.0/config/cloudprovider.loadbalancing/#requirements","title":"Requirements","text":"
    • A kubernetes cloud
    • A cloud provider account
    "},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-http-loadbalancer","title":"Update nginx service to use http LoadBalancer","text":"

    Replace type: NodePortby type: LoadBalancer into the nginx service

    Save this yaml as nginx.service.http.loadbalancer.yaml file name

    kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od \n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n
    # delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new  nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n

    Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service

    kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP      None             <none>        <none>            57m\nmemcached   ClusterIP      10.245.247.50    <none>        11211/TCP         57m\nmongodb     ClusterIP      10.245.198.243   <none>        27017/TCP         57m\nnginx       LoadBalancer   10.245.172.53    <pending>     80:30443/TCP      57m\nopenldap    ClusterIP      10.245.109.131   <none>        389/TCP,636/TCP   57m\npyos        ClusterIP      10.245.94.15     <none>        8000/TCP          57m\nspeedtest   ClusterIP      10.245.67.168    <none>        80/TCP            57m\n

    You get the EXTERNAL-IP for your LoadBalancer service

    kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\ndesktop     ClusterIP      None             <none>         <none>            61m\nmemcached   ClusterIP      10.245.247.50    <none>         11211/TCP         61m\nmongodb     ClusterIP      10.245.198.243   <none>         27017/TCP         61m\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      61m\nopenldap    ClusterIP      10.245.109.131   <none>         389/TCP,636/TCP   61m\npyos        ClusterIP      10.245.94.15     <none>         8000/TCP          61m\nspeedtest   ClusterIP      10.245.67.168    <none>         80/TCP            61m\n

    Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4

    Login using Philip J. Fry

    And you should get the fry desktop

    "},{"location":"3.0/config/cloudprovider.loadbalancing/#troubleshooting-with-port-forward","title":"Troubleshooting with port-forward","text":"

    Use the kubectl port-forward command and a forwarded local port to help troubleshooting issues.

    Get the pod name for nginx

    kubectl get pods -l run=nginx-od -n abcdesktop\nNAME                        READY   STATUS    RESTARTS   AGE\nnginx-od-69fb8fd8bb-qg4z2   1/1     Running   0          11h\n

    Choose the nginx's pod, to forward local port 80 to nginx 80

    kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n

    Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80

    Then open your web browser http://localhost, you should get the home page, login using LDAP auth or Anonymous auth should work.

    Then login, and you get a pod user.

    For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.

    kubectl get pods -n abcdesktop                                                   \nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-bdcbbcb74-nhd68    1/1     Running   0          11h\nmongodb-od-d46d79476-fmbj5      1/1     Running   0          11h\nnginx-od-69fb8fd8bb-qg4z2       1/1     Running   0          11h\nopenldap-od-795c55f6db-wz7l4    1/1     Running   0          11h\npyos-od-988887859-8kwdx         1/1     Running   0          11h\nspeedtest-od-6b5f8584f5-cs69t   1/1     Running   0          11h\nfry-2cf3a                       4/4     Running   0          4m15s\n

    The user fry gets the abcdesktop pod fry-2cf3a

    "},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-loadbalancer-service-with-https","title":"Update nginx service to use LoadBalancer service with https","text":"

    This example works on digitalocean cloud provider.

    First of all, you need to get your loadbalancer-certificate-id

    To list available certificates and their IDs, install doctl and run the command

    doctl compute certificate list\n

    Then define annotations on the abcdesktop nginx service like

      service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n  service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n  service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n

    Create a loadbalancing.yaml file, to update the default abcdestkop service/nginx You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id with your own certificate value.

    ---         \nkind: Service \napiVersion: v1\nmetadata:   \n  name: nginx \n  namespace: abcdesktop\n  annotations:\n    service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n    service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n    service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n  labels:\n    abcdesktop/role: nginx\nspec: \n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 443\n    targetPort: 80\n    name: https\n---\n

    Apply the new loadbalancing.yaml file

    kubectl apply -f loadbalancing.yaml\n

    You can read

    service/nginx configured\n

    Check the nginx/services

    kubectl get service/nginx -n abcdesktop\n
    NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE\nnginx   LoadBalancer   10.245.188.146   161.35.246.4    443:32086/TCP   28m\n

    Now you can replace http by the secure protocol https

    "},{"location":"3.0/config/controllers/","title":"Controllers","text":""},{"location":"3.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    List of all abcdesktop's controllers and the description :

    Controller Description AccountingController accounting data json format AuthController authenticate user ComposerController CRUD main services (like createDesktop, createApplication) CoreController get configuration and user message info ManagerController manage service (like add an application) UserController retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The controllers configuration is a dictionary, and is defined in the pyos's od.config file.

    controllers : { \n    'AccountingController': { \n        'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'ManagerController': { \n        'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'AuthController' :      { 'permitip': None },\n    'ComposerController' :  { 'permitip': None },\n    'CoreController' :      { 'permitip': None },\n    'UserController' :      { 'permitip': None }\n} \n

    By default, AccountingController and ManagerController access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.

    By default, others controllers access is enabled, without any restriction.

    "},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"

    The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller name and with entries permitip and/or apikey.

    • The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or if the controller is not defined, filtering features is disabled.
    • The apikey is a list of string, for example [ 'fPCdPSSj8gZri1Ncmg', 'Z9pXCa2y6ccDeBBeeUc4' ]. If apikey is not set or the controller not defined, filtering features is disabled. The http header value is X-API-Key

    If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key","text":"

    Add the http header X-API-Key: fQDbvjCafec4l to the curl command to list images

    curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

    The command returns

    {}\n

    Add the http header X-API-Key: fQDbvjCafec4l to the curl command to add new application

    curl -X POST -H 'X-API-Key: fQDbvjCafec4l'  -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n

    The command returns

    [\n {  \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n    \"path\": \"/usr/bin/xeyes\", \n    \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n    \"id\": \"abcdesktopio/xeyes.d:3.0\", \n    \"rules\": {}, \n    \"acl\": {\"permit\": [\"all\"]}, \n    \"launch\": \"xeyes.XEyes\", \n    \"name\": \"xeyes\", \n    \"icon\": \"circle_xfce4-eyes.svg\", \n    \"keyword\": \"xeyes,eyes\", \n    \"uniquerunkey\": null, \n    \"cat\": \"utilities\", \n    \"args\": null, \n    \"execmode\": null, \n    \"showinview\": null, \n    \"displayname\": \"xeyes\", \n    \"home\": null, \n    \"desktopfile\": null, \n    \"executeclassname\": null, \n    \"executablefilename\": \"xeyes\", \n    \"usedefaultapplication\": false, \n    \"mimetype\": [], \n    \"fileextensions\": [], \n    \"legacyfileextensions\": [], \n    \"secrets_requirement\": null, \n    \"image_pull_policy\": \"IfNotPresent\", \n    \"image_pull_secrets\": null, \n    \"containerengine\": \"ephemeral_container\", \n    \"securitycontext\": {}\n }\n]\n
    "},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"
    curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

    The command returns

    {\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
    "},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"

    The od.config contains options to describe how the oc.user and applications containers have to be created.

    "},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

    All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

    Option name Type Sample desktop.defaultbackgroundcolors list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype string 'hostPath' desktop.remotehomedirectorytype list [] desktop.persistentvolumespec string None desktop.persistentvolumeclaimspec string None desktop.homedirectorytype string 'hostPath' desktop.envlocal dictionary { 'X11LISTEN':'tcp'} desktop.nodeselector dictionary {} desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon' desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 } desktop.webhookdict dictionary {}"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

    This option describes how to create the home directory for the user. The value can be defined as :

    • 'None': no dedicated volume is created, the oc.user container use an emptyDir': { 'medium': 'Memory'}. All user data will be removed at logout.
    • 'hostPath': set a dedicated 'hostPath' volume, the user's container and applications share this volume. User home data are persistent.
    • 'persistentVolumeClaim': set a dedicated 'persistentVolumeClaim' volume, the user's container and applications share this volume. User home data are persistent.

    To get more information about user's home directory volume, read the volumes chapter

    "},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

    desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

    For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

    If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

    "},{"location":"3.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

    The desktop.defaultbackgroundcolors allow you to change the default background color.

    The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

    The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

    Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    You should see the default background colors, for example :

    "},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

    desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

    The default value is :

    { \n  'X11LISTEN': 'tcp'\n}\n
    "},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTEN tcp permit X11 to listen on tcp port, default is udp ABCDESKTOP_RUN_DIR /var/run/desktop directory to write pid services ABCDESKTOP_LOG_DIR /var/log/desktop directory to write log files services DISABLE_REMOTEIP_FILTERING disabled disabled remote ip filtering inside pod user, default is disabled, change to enabled to remove core ip filtering SET_DEFAULT_WALLPAPER myfile.jpeg name of file to set the user wallpaper, this file must exist in ~/.wallpapers SET_DEFAULT_COLOR #6EC6F0 Value of default colour saved in file ~/.store/currentColor SENDCUTTEXT enabled \u00a0Send clipboard changes to user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}. The default value is enabled ACCEPTCUTTEXT enabled \u00a0Accept clipboard updates from user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}. The default value is enabled"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

    desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes.

    It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

    The value must be a string, by example 'true', and matches the labels node value.

    desktop.nodeselector:  { 'abcdesktopworker': 'true' }\n

    To set a label abcdesktopworker=true to a node

    kubectl label node $YOUR_NODE abcdesktopworker=true\n

    The commands returns

    node/nodesample01 labeled\n

    To list all labels on all nodes

    kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n

    The commands returns

    map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n

    desktop.nodeselector is used as selector by pyos to create user's pods and to pull container's images.

    "},{"location":"3.0/config/desktop/#desktopusername","title":"desktop.username","text":"

    desktop.username is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.

    "},{"location":"3.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

    desktop.userid describes the uid Number of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

    "},{"location":"3.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

    desktop.groupid describes the gid Number of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

    "},{"location":"3.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

    desktop.userhomedirectory describes the homedirectory of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

    "},{"location":"3.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

    The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

    "},{"location":"3.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

    desktop.policies has a dictionary format.

    Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } acl allow or denied desktop creation

    Example

    desktop.policies: { \n  'rules': { \n    'volumes': { \n      'domainuser':   { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n      'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n      } \n  },\n  'acls' : {},\n  'max_app_counter' : 4  \n}\n
    "},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

    desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

    "},{"location":"3.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"3.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

    WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

    desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

    Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

    If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

    To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

    kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
    "},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"

    abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.

    For example

    • printer is a service. printer service runs inside the user pod.
    • graphical is a service. graphical service runs inside the user pod and is the default service.
    "},{"location":"3.0/config/desktop.pod/#containers-in-the-user-pod","title":"containers in the user pod","text":"
    • init contains init command for user pod
    • graphical is the user graphical service (X11 and VNC)
    • spawner is the command service for graphical service
    • broadcast is the broadcast service for graphical service
    • webshell is the web socket bash shell service for graphical service
    • printer is the printer service (cupsd)
    • printerfile is the file service to download generated PDF file (this file transfert service is dedicated for printer service)
    • sound is the sound service (pulseaudio) to send rtp stream from a container to the web browser via janus webrtc gateway
    • filer is the filer service to upload and download file into the user home directory
    • storage contains abcdesktop user secrets, like Kerberos, NTLM hashes, VNC password.

    Each service :

    • can be enable or disable 'enable': True
    • can set dedicated 'resources' limits resources for a container
    • can set dedicated 'acl' to start or not using rules
    • can set dedicated 'securityContext' or use the spec securityContext
    • can set dedicated 'secrets_requirement, a list of secrets to run example ['abcdesktop/vnc', 'abcdesktop/kerberos']
    "},{"location":"3.0/config/desktop.pod/#default-desktoppod","title":"default desktop.pod","text":"
    desktop.pod : { \n  'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n  },  \n  'graphical' : { \n    'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'resources': { \n            'requests': { 'memory': \"320Mi\", 'cpu': \"250m\"  }, \n            'limits':   { 'memory': \"1Gi\",   'cpu': \"1000m\" } \n    },\n    'shareProcessNamespace': True,\n    'tcpport': 6081,\n    'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n  },\n  'spawner' : { \n    'enable': True,\n    'tcpport': 29786,\n    'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'broadcast' : { \n    'enable': True,\n    'tcpport': 29784,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'webshell' : { \n    'enable': True,\n    'tcpport': 29781,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printer' : { \n    'image': 'abcdesktopio/oc.cupsd:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 681,\n    # cupsd need to start as root\n    'securityContext': { 'runAsUser': 0 },\n    'resources': { \n      'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" },  \n      'limits'  : { 'memory': \"512Mi\",  'cpu': \"500m\" } \n    },\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printerfile' : { \n    'enable': True,\n    'tcpport': 29782,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'filer' : { \n    'image': 'abcdesktopio/oc.filer:3.0',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'tcpport': 29783,\n    'acl':  { 'permit': [ 'all' ] } \n    },\n  'storage' : { \n    'image': 'k8s.gcr.io/pause:3.8',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"32Mi\",  'cpu': \"100m\" },  \n      'limits'  : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n    }\n  },\n  'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': False,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"8Mi\",  'cpu': \"50m\"  },  \n      'limits'  : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n    } \n  },\n  'init': { \n    'image': 'busybox',\n    'enable': True,\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'imagePullPolicy': 'IfNotPresent',\n    'securityContext': { 'runAsUser': 0 },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n  },\n  'ephemeral_container': {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n     },\n    'acl':  { 'permit': [ 'all' ] }\n  },\n  'pod_application' : {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n    },\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'acl':  { 'permit': [ 'all' ] } } }\n\n
    "},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"

    A container is added to the user pod if 'enable': True

    "},{"location":"3.0/config/desktop.pod/#acl","title":"acl","text":"

    The container is added to the user pod if acl matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.

    "},{"location":"3.0/config/desktop.pod/#pullpolicy","title":"pullpolicy","text":"

    The image use the kubernetes pull policy values :

    • IfNotPresent the image is pulled only if it is not already present locally.
    • Always kubelet queries the container image registry to resolve the name to an image digest.
    • Never the kubelet does not try fetching the image. If the image is somehow already present locally, the kubelet attempts to start the container; otherwise, startup fails.

    Read the pullpolicy kubernetes documentation to get more details.

    "},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"

    waitportbin is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport value.

    The command is run with parameters :

    /composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
    "},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"

    waitportbintimeout is the timeout in seconds to get waitportbin command result.

    "},{"location":"3.0/config/desktop.pod/#image","title":"image","text":"

    Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0')

    "},{"location":"3.0/config/desktop.pod/#imagepullsecrets","title":"imagePullSecrets","text":"

    The imagePullSecret entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.

     imagePullSecret : [ { 'name': name_of_secret } ]\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with the docker hub.
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with your own privateregistry
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n

    The imagePullSecret become in this sample

     imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
    "},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"

    Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.

    "},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"

    spec entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.

    • {{ uidNumber }} is replaced by the user's uidNumber on ldap if the objectClass is posixAccount or if not set by the default user id set in option desktop.userid

    • {{ gidNumber }} is replaced by the user's gidNumber on ldap if the objectClass is posixAccount is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid

    • {{ supplementalGroups }} is replaced by the list of groups gidNumber is posixGroup

    • shareProcessNamespace When process namespace sharing is enabled, processes in a container are visible to all other containers in the same pod. Read the kubernetes shareProcessNamespace details, to get more details.

    • shareProcessMemory Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries. POSIX shared memory requires that a tmpfs be mounted at /dev/shm. Containers in a pod do not share their mount namespaces so we use volumes to provide the same /dev/shm into each container in a pod. Read shared_memory to get more details. Shared memory is defined as an emptyDir volume { 'name': 'shm', { 'medium': 'Memory', 'sizeLimit': shareProcessMemorySize } } minted on /dev/shm. Only ephemeral container application can share memory with the X11 server. To get more details about POSIX and UNIX System V shared memory objects, read the podshmtest repository.

    • shareProcessMemorySize is the size of shareProcessMemory. The size is set to the shm volume 'sizeLimit': shareProcessMemorySize

    'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n
    "},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"

    init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }.

    The command support {{ }} values. Values can be

    • '{{ uidNumber }}'
    • '{{ gidNumber }}'
    • '{{ uid }}'

    Values are read from the previous ldap authentification.

    • '{{ uidNumber }}' is replaced by the ldap uidNumber or if not set by the default user id set in option desktop.userid
    • '{{ gidNumber }}' is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
    • '{{ uid }}' is replaced by the ldap uid or if not set by the default user name set in option desktop.username

    Example

     'command':  [ 'sh', '-c',  'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
    "},{"location":"3.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

    The pyos core service configuration file name is od.config

    "},{"location":"3.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n
    "},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"

    Change the defaultbackgroundcolors option in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local file od.config.

    "},{"location":"3.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

    "},{"location":"3.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
    kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
    "},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

    To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colour and you should have it as background colour :

    Great, you can easily update your configuration file od.config.

    "},{"location":"3.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"3.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"3.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"3.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"3.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"3.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"3.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"3.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":"
    • Apply network policies to control traffic flow at the IP address or port level of abcdesktop pods, this includes user's pods.
    "},{"location":"3.0/config/networkpolicy/#authors","title":"Authors","text":"

    jpxavier-oio has designed the network policy for abcdesktop.io

    "},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":"
    • You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes.
    • Network policies are implemented by the network plugin. To use network policies, you must be using a networking solution which supports NetworkPolicy.
    "},{"location":"3.0/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

    There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

    • The NetworkPolicy rights contains egress and ingress for pod selected by tag. rights means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.

    • The NetworkPolicy permits contains egress to a pod selected by tag. The NetworkPolicy permits means permit access to this pod.

    "},{"location":"3.0/config/networkpolicy/#networkpolicy-example","title":"NetworkPolicy example","text":"

    The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.

    "},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicy rights and permits for the memcached.","text":"

    The memcached service is listening on TCP port 11211. The NetworkPolicy for memcached service rights, named memcached-rights, allows pods with label run: memcached-od to expose the TCP port 11211.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      run: memcached-od\n  policyTypes:\n  - Ingress\n  ingress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    from:\n    - podSelector:\n        matchLabels:\n          netpol/memcached: 'true'\n    - namespaceSelector:\n        matchLabels:\n          name: kube-monitor\n      podSelector:\n        matchLabels:\n          netpol/metrics: 'true'\n

    The NetworkPolicy for memcached service permits, named memcached-permits, allows all pods with label netpol/memcached: 'true' to reach the TCP port 11211 to pods with label run: memcached-od.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/memcached: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    to:\n    - podSelector:\n        matchLabels:\n          run: memcached-od\n---\n
    "},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights and permits for the user's pods.","text":"

    The ocuser pod is listening on TCP ports :

    • 4714
    • 6081
    • 29780
    • 29781
    • 29782
    • 29783
    • 29784
    • 29785
    • 29786

    The network policy for ocuser's pods rights is named ocuser-rights. It allows pods with label type: 'x11server' to expose the previous TCP ports.

    The egress network policy allows :

    • dns queries to kube-dns
    • http to any web site
    • https to any web site
    • kerberos auth to any kdc
    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      type: 'x11server'\n  policyTypes:\n  - Ingress\n  - Egress\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          netpol/ocuser: 'true'\n    ports:\n    - protocol: TCP\n      port: 4714\n    - protocol: TCP\n      port: 6081\n    - protocol: TCP\n      port: 8000\n    - protocol: TCP\n      port: 29780\n    - protocol: TCP\n      port: 29781\n    - protocol: TCP\n      port: 29782\n    - protocol: TCP\n      port: 29783\n    - protocol: TCP\n      port: 29784\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n  egress:\n  # pod user can run dns query to all kube-system\n  - ports:\n    - protocol: TCP\n      port: 53\n    - protocol: UDP\n      port: 53\n    to:\n    - namespaceSelector:\n        matchLabels:\n          name: kube-system\n      podSelector:\n        matchLabels:\n          k8s-app: kube-dns\n# permit www website from pod user \n  - ports:\n    - protocol: TCP\n      port: 443\n    - protocol: TCP\n      port: 80\n# permit kerberos auth kinit\n  - ports:\n    - protocol: UDP\n      port: 88\n    - protocol: TCP\n      port: 88\n

    The network policy for ocuser's pods permits is named ocuser-permits. It allows pods with label netpol/ocuser: 'true' to reach the user's pods services.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/ocuser: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - podSelector:\n        matchLabels:\n          type: 'x11server'\n    ports:\n    # default pulseaudio websocket audio without webrtc gateway\n    - protocol: TCP\n      port: 4714\n    # vnc websockify\n    - protocol: TCP\n      port: 6081\n    # reserved\n    - protocol: TCP\n      port: 29780\n    # xterm_tcp_port\n    - protocol: TCP\n      port: 29781\n    # printerfile_service_tcp_port\n    - protocol: TCP\n      port: 29782\n    # file_service_tcp_port\n    - protocol: TCP\n      port: 29783\n    # broadcast_tcp_port \n    - protocol: TCP\n      port: 29784\n    # reserved\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n
    "},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml file","text":"

    To apply the network policies run the command :

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n

    The command returns

    networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
    "},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
    • Login to your abcdesktop
    • Open a webshell and run a curl command.
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    This http request is denied by the network policy and you should get an error message

    You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

    "},{"location":"3.0/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

    To disable the network policies, run the kubectl delete command :

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
    • Login to your abcdesktop
    • Open the web shell to run the same curl command
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    You should get a json document as http response

    {}\n

    You may need to update the netpol-default.yaml file with your own values.

    "},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"3.0/config/sudo-kubernetes/","title":"Sudo kubernetes","text":""},{"location":"3.0/config/sudo-kubernetes/#how-to-get-a-root-access-inside-a-container-running-kubernetes-abcdesktop","title":"How to get a root access inside a container running kubernetes abcdesktop ?","text":"

    run the sudo command inside the user kubernetes pods

    balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
    "},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"

    In the securityContext add the entry 'allowPrivilegeEscalation': True

    desktop.pod : {\n  'spec'   : {\n    'shareProcessMemorySize': '512Mi',\n    'shareProcessMemory': True,\n    'shareProcessNamespace': True,\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True, \n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'capabilities': { \n        'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n      }\n    }\n  }\n...\n
    "},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"
    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"

    Delete the pyos pod

    kubectl delete pods -l run=pyos-od  -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
    1. Make sure that your user has done a logoff his pod, then login again and run terminal web shell

    The default balloon password is lmdpocpetit

    balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~#  \n

    After the sudo command, you get a root level inside the shell of the users's pod

    In production this value should be set to False

    "},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume using hostPath. The hostPath can also be a mount point.
    • PersistentVolumeClaim using storageClassName parameter. Two examples are described one using nfs, the second one using s3.
    "},{"location":"3.0/config/volumes/#define-persistentvolume-using-hostpath","title":"Define persistentVolume using hostPath","text":"

    In your od.config file, define the new entries desktop.homedirectorytype desktop.persistentvolumespec desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim'
    • desktop.persistentvolumespec: create a new volume for the user's homeDir, for persistentVolume hostPath.
    • desktop.persistentvolumeclaimspec: create a new volume claim for the user's homeDir
    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n            'storageClassName': '',\n            'capacity': { 'storage': '1Gi' },\n            'accessModes': [ 'ReadWriteOnce' ], \n            'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': '',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'.

    • {{ provider }} is the provider's name templated value.
    • {{ userid }} is the user's id templated value.

    The list of all template values can be read at the end of this chapter

    The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}. The directory is created automatically by kubernetes.

    The /mnt/abcdesktop_volumes/ content lists the provider name.

    On the host, the new directory is created, where each home directory is located.

    Read the new path for 'hostPath' persistent volumes

    ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai   11 11:34 ..\ndrwxr-xr-x   3 root root 4096 mai   12 12:40 anonymous\ndrwxr-xr-x   3 root root 4096 mai   12 12:39 github\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 google\n

    For provider google, all users are listed.

    ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 114102844260599245242\n

    For provider google, list the user home directory for the user 103464335761332102620

    ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\n-rw-------  1 2048 2048   71 mai   12 12:39 .Xauthority\n-rw-rw-r--  1 2048 2048   12 janv. 27 18:36 .Xresources\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .cache\ndrwxr-x---  6 2048 2048 4096 mai   12 12:39 .config\ndrwxrwxr-x  3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r-----  1 2048 2048    0 mai   12 12:39 .gtk-bookmarks\n-rw-rw-r--  1 2048 2048  564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .local\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .store\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .wallpapers\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Desktop\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Documents\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Downloads\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Music\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Pictures\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Public\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Templates\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Videos\n
    "},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rules

    Note: hostPath supports file permissions and the pod's init commands chown or chmod can be used. The hostPath can also be a mount point, using nfs.

    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-storageclassname","title":"Define persistentVolumeClaim using storageClassName","text":"

    To define a persistentVolumeClaim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n

    desktop.persistentvolumeclaimspec is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.

    For example

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'mystorageclass',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    Replace mystorageclass by storageclass of your cloud provider

    kubectl get storageclass\n

    The example output is as follows on the cloud provider aws.

    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n

    The example output is as follows on the cloud provider digitalocean.

    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs","text":"

    In this example, we use nfs to share user home directory with each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.0/config/volumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistentVolumeClaim features.
    • desktop.persistentvolumespec: None to skip the persistent volume provisioning.
    • desktop.persistentvolumeclaimspec create a new volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'nfs-csi-sc-ds01',\n            'resources': { \n              'requests': { \n                'storage': '500Mi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    Update the new config file and restart pyos pod

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
    "},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.0/config/volumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            Delete           Bound    abcdesktop/planet-fry-9372f   nfs-csi-sc-ds01            3m\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry-9372f   Bound    pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            nfs-csi-sc-ds01   5m7s\n

    Get the PersistentVolumeClaim's description

    kubectl describe pvc planet-fry-9372f -n abcdesktop \nName:          planet-fry-9372f\nNamespace:     abcdesktop\nStorageClass:  nfs-csi-sc-ds01\nStatus:        Bound\nVolume:        pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\n               pv.kubernetes.io/bound-by-controller: yes\n               volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n               volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      25Mi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-87066\nEvents:\n  Type    Reason                 Age              From                                                        Message\n  ----    ------                 ----             ----                                                        -------\n  Normal  ExternalProvisioning   7m (x2 over 7m)  persistentvolume-controller                                 Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n  Normal  Provisioning           7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n  Normal  ProvisioningSucceeded  7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
    "},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"

    Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server

    The user fry has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com

    Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry uidNumber 1049 gidNumber 2049 \u00a0homeDirectory: \u00a0/home/fry

    On the nfs server, define a quota for uid fry. In this case, I use truenas as nfs server.

    Create the fry user with the same attribute and value.

    On the Storage |\u00a0Pools |\u00a0User Quotas, define a quota for the user fry

    Set the quota value for fry

    "},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service_1","title":"Login to your abcdesktop service","text":"

    Delete previous pvc and pv for the fry user, if need.

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the dd commands

    Run a dd command to reach the quota value (50 MiB is this case).

    dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n

    You should get the error Disk quota exceeded. The size of quota-test-file is over a the quota limit.

    50 MB is 52,428,800 Bytes

    ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n

    The user should not be able to create new file

    dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n

    The nfs server has returned an error if the user tries to create more than 50 MiB.

    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim using k8s-csi-s3","text":"

    In this example, we use s3 to share user home directory with each worker node

    Use the https://github.com/yandex-cloud/k8s-csi-s3 as a CSI for S3 with minio as backend.

    Follow https://github.com/yandex-cloud/k8s-csi-s3 setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.

    "},{"location":"3.0/config/volumes/#update-storageclassyaml-file","title":"Update storageclass.yaml file","text":"
    ---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n  mounter: geesefs \n  # you can set mount options here, for example limit memory cache size (recommended)\n  options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n  # to use an existing bucket, specify it here:\n  # bucket: abcdesktop\n  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n  csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n

    Update the csi-s3 storage class to add --setuid 0 as options

    kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
    "},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistentVolumeClaim features.
    • desktop.persistentvolumespec: None to skip the persistent volume provisioning.
    • desktop.persistentvolumeclaimspec create a new volume claim for the user's homeDir, the storageClassName csi-s3
    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'csi-s3',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n
    "},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"

    By default the storageclass use mounter: geesefs. geesefs does not store file permissions and the init commands chown or chmod exit with no zero value, then the pod does not start. All files belongs to root, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\".

    Update the 'init' in desktop.pod dict

    'init': { \n    'image': 'busybox',\n    'enable': True,\n    'pullpolicy':  'IfNotPresent',\n    'securityContext': {\n        'runAsUser':   0,\n        'runAsGroup':  0 \n    },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n  }\n

    Apply the new configuration file and restart pyos pods

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to abcdestkop service using your web browser.

    List the persistent volumes

    kubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                             STORAGECLASS               REASON   AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            Delete           Bound    abcdesktop/github-12896316-96cb5                  csi-s3                              2m46s\n

    List the persistent volume claims

    # kubectl get pvc -n abcdesktop\nNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE\ngithub-12896316-96cb5                  Bound    pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            csi-s3                     2m21s\n
    "},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"3.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"3.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"3.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"3.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"3.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    \n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite

    "},{"location":"3.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"

    "},{"location":"3.0/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.0/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04

    "},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"

    Execute command swapoff to disable swap.

    swapoff -a\n

    Load the overlay and br_netfilter kernel modules

    modprobe overlay\nmodprobe br_netfilter\n

    Create the containerd.conf to load modules

    cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io from docker repository","text":"

    Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :

    Install common packages

    apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n

    Add source

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n

    You will be prompted with a Y/n option in order to proceed with the installation.

    apt update\napt install -y containerd.io\n

    containerd.io will then be installed on your system.

    "},{"location":"3.0/setup/k8slinuxinstallation/#step-2-configure-containerdio","title":"Step 2: Configure containerd.io","text":"

    Configure containerd to use systemd as cgroup.

    containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n

    Enable the containerd utility by running the following command :

    systemctl restart containerd\nsystemctl enable containerd\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"

    Run the following command in order to get the Kubernetes signing key:

    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"

    Run the following commands in order to add the Xenial Kubernetes repository:

    echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"

    Create kubernetes.conf for sysctl.d

    cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n

    Reload your system sysctl changes

    sysctl --system\n

    Install the packages kubelet kubeadm kubectl

    apt install -y kubelet kubeadm kubectl\n

    K8s utilities will then be installed on your system.

    You can check the version number of kubeadm and also verify the installation through the following command:

     kubeadm version -o yaml\n
    clientVersion:\n  buildDate: \"2022-10-12T10:55:36Z\"\n  compiler: gc\n  gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n  gitTreeState: clean\n  gitVersion: v1.25.3\n  goVersion: go1.19.2\n  major: \"1\"\n  minor: \"25\"\n  platform: linux/amd64\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n

    Option : To use the namespace abcdestkop as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop

    All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n

    Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.

    change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                           TYPE                                  DATA   AGE\ndefault-token-5zknd            kubernetes.io/service-account-token   3      6m6s\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. This container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n

    You should read on the standard output

    clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          59m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          59m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          59m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          59m\npyos-od-5586b88767-6gdtk        1/1     Running   0          59m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          59m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"

    All kubernetes resources can be inspected to get more informations.

    First list elements you want to verify, in the following case, we will inspect pods :

    kubectl get pods -n abcdesktop\n
    NAME                            READY   STATUS             RESTARTS   AGE\nnginx-od-db69c45fb-qnd4n        1/1     Running            0          92s\npyos-od-5586b88767-6gdtk        1/1     Running            0          92s\nmemcached-od-db69c45fb-mqt4n    1/1     Running            0          92s\nmongodb-od-ff874fcb5-sm6f7      1/1     Running            0          92s\nspeedtest-od-55c58fdd69-5znpr   0/1     ImagePullBackOff   0          92s\n

    As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :

    kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop

    In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :

        Events:\n      Type     Reason   Age                    From             Message\n      ----     ------   ----                   ----             -------\n      Warning  Failed   7m6s (x4837 over 18h)  kubelet, cube05  Error: ImagePullBackOff\n      Normal   BackOff  2m9s (x4860 over 18h)  kubelet, cube05  Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n

    As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"
    kubectl get deployment -n abcdesktop\n

    You should read on the standard output

    NAME           READY   UP-TO-DATE   AVAILABLE   AGE\nmemcached-od   1/1     1            1           10m\nmongodb-od     1/1     1            1           10m\nnginx-od       1/1     1            1           4m26s\nopenldap-od    1/1     1            1           10m\npyos-od        1/1     1            1           3m2s\nspeedtest-od   1/1     1            1           10m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"
    kubectl get services -n abcdesktop\n

    You should read on the standard output

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP   None             <none>        <none>            11m\nmemcached   ClusterIP   10.107.106.62    <none>        11211/TCP         11m\nmongodb     ClusterIP   10.96.113.246    <none>        27017/TCP         11m\nnginx       NodePort    10.100.253.228   <none>        80:30443/TCP      11m\nopenldap    ClusterIP   10.105.69.239    <none>        389/TCP,636/TCP   11m\npyos        ClusterIP   10.98.97.186     <none>        8000/TCP          11m\nspeedtest   ClusterIP   10.109.48.166    <none>        80/TCP            11m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"

    cluster roles are disable by default

    kubectl describe ClusterRole pyos-role -n abcdesktop\n

    You should read on the standard output

    Name:         pyos-role\nLabels:       <none>\nAnnotations:  <none>\nPolicyRule:\n  Resources                 Non-Resource URLs  Resource Names  Verbs\n  ---------                 -----------------  --------------  -----\n  pods/ephemeralcontainers  []                 []              [create get list watch update patch delete]\n  pods/exec                 []                 []              [create get list watch update patch delete]\n  persistentvolumes         []                 []              [get list create delete]\n  persistentvolumeclaims    []                 []              [get list update create delete]\n  configmaps                []                 []              [get list watch create update patch delete]\n  pods                      []                 []              [get list watch create update patch delete]\n  secrets                   []                 []              [get list watch create update patch delete]\n  events                    []                 []              [get list watch]\n  pods/log                  []                 []              [get list watch]\n  endpoints                 []                 []              [get list]\n  nodes                     []                 []              [get watch list]\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"

    cluster roles Bindind are disable by default

    kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n

    You should read on the standard output

    Name:         pyos-rbac\nLabels:       <none>\nAnnotations:  <none>\nRole:\n  Kind:  ClusterRole\n  Name:  pyos-role\nSubjects:\n  Kind            Name                 Namespace\n  ----            ----                 ---------\n  ServiceAccount  pyos-serviceaccount  abcdesktop\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"
    kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n

    You should read on the standard output

    2023-05-17 13:29:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"

    To rollout restart the abcdesktop deployment

    kubectl rollout restart deployment -n abcdesktop\n

    You should read on the standard output

    deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n

    Check the pods status

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS        RESTARTS   AGE\nmemcached-od-64c56f9458-jcf9x   1/1     Running       0          32s\nmongodb-od-5b5cc9946d-q7fph     1/1     Running       0          32s\nnginx-od-58bdf79df4-skjsn       1/1     Running       0          32s\nopenldap-od-6dcc5d7f8b-g8gvj    1/1     Running       0          32s\npyos-od-784bd7b5c5-tdzxx        1/1     Running       0          32s\nspeedtest-od-5ff99b6579-st9jx   1/1     Running       0          32s\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.0.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST API

    curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"

    This section apply only to configure kubernetes for GNU/Linux.

    abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.

    "},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"

    Linux Requierements

    "},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"

    The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.

    "},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"

    You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.

    swapoff -a\n

    If you have some swaps in /etc/fstab, just comment them out. swapoff -a will disable all swaps temporarily.

    • disable by masking it with sysctl:
    systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
    "},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"

    Run the following command as sudo on the master node:

    kubeadm init --pod-network-cidr=10.244.0.0/16\n

    The process might take a minute or more depending on your internet connection.

    To be able to manage your kubernetes server, you need to run the following commands as a regular user:

    mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
    "},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"

    Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.

    kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n

    It should return the following string.

    node/<your-hostname> untainted\n

    Taints are Kubernetes flags to prevent Pod Scheduling.

    Confirm that you now have a node in your cluster with the following command.

    kubectl get nodes -o wide\n

    It should return something like the following.

    NAME      STATUS     ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nhostname  NotReady   control-plane   3m17s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n
    "},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"

    A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n

    It should return the following strings.

    namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
    "},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"

    Now when you see the status of the nodes, you will see that the master-node is ready :

    kubectl get nodes -o wide\n
    NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nHostname  Ready    control-plane   4m12s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n

    At this step, there is no more Taints and your node is Ready.

    Next step, continue with the setup abcdesktop for kubernetes.

    "},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":"
    • Architecture x86-64 (arm-64 is not yet available)
    • 16 GB of free space to store sample applications (gimp, libreoffice writer, libreoffice calc, libreoffice math, libreoffice impress, firefox) and core image services.
    "},{"location":"3.0/setup/requirements/#release-3x","title":"Release 3.x","text":"
    • kubernetes release must be greater or equal to 1.24
    $ kubectl version --output=yaml\n
    serverVersion:\n  buildDate: \"2022-05-24T12:18:48Z\"\n  compiler: gc\n  gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n  gitTreeState: clean\n  gitVersion: v1.24.1\n  goVersion: go1.18.2\n  major: \"1\"\n  minor: \"24\"\n  platform: linux/amd64\n
    • You do not need to install dockerd.
    • There is no depend to dockerd anymore. In this release and all next releases, application can run as :
    • kubernetes pod
    • ephemeral container. Read more informations about on ephermeral container
    • All container-runtimes are supported. containerd is recommended py default.
    "},{"location":"3.0/setup/requirements/#microk8s-support","title":"microk8s support","text":"

    microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.

    "},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"
    • kubernetes release must be greater or equal to 1.24
    $ microk8s kubectl version --output=yaml\nclientVersion:\n  buildDate: \"2022-09-28T14:42:45Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n  buildDate: \"2022-09-28T14:40:13Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\n
    "},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns add one to microk8s","text":"
    $ microk8s enable dns\n

    You should ready on stdout

    $ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n

    Check microk8s status

    $ microk8s status\nmicrok8s is running\nhigh-availability: no\n  datastore master nodes: 127.0.0.1:19001\n  datastore standby nodes: none\naddons:\n  enabled:\n    dns                  # (core) CoreDNS\n    ha-cluster           # (core) Configure high availability on the current node\n
    "},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"

    images support only architectures x86-64. The architectures supported by this image is:

    Architecture Tag x86-64 amd64-latest"},{"location":"3.0/setup/requirements/#gnulinux","title":"GNU/Linux","text":"

    The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)

    "},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

    The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
    kubectl logs -l run=nginx-od -n abcdesktop\n
    "},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
    running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

    Nginx has failed to start. There is an error in the configuration file.

    We need to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n

    Check that nginx pod has been updated and that the status is Running

    kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

    Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

    Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

    kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

    Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

    nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

    It's time to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

    The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
    kubectl logs -l run=pyos-od -n abcdesktop\n
    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    It's time to fix the abcdesktop-config ConfigMap.

    "},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n

    Check that pyos pod is Running

    kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

    Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

    Run the command cd /var/pyos && ./od.py

    kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

    od.py command returns the same explicit error, the od.config file is wrong.

    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    We need to fix the abcdesktop-config ConfigMap in the yaml file.

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.0.sh bash script using a curl or run step by step uninstall commands manually.

    "},{"location":"3.0/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n

    You should read on stdout

    starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
    "},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"

    Run the bash commands from the uninstall-3.0.sh main content :

    echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n

    The last command kubectl delete namespace can take few minutes.

    Please wait for the output message:

    abcdesktop is uninstalled\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume
    • PersistentVolumeClaim

    In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

    • abcdestkop has a Persistent Volume Claim support.

    Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

    "},{"location":"3.1/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

    Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

    - apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

    Update the default pyos role to ClusterRole

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    "},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

    To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
    "},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

    To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

    desktop.homedirectorytype: 'persistentVolumeClaim'\n
    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

    desktop.persistentvolume is optional and can be set to None, else the type of desktop.persistentvolume parameter must be a dict (dictionary).

    If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

    If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume.

    If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

    The type of desktop.persistentvolumeclaim is dictionary or a string.

    If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a str.

    Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

    if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

    Get more information about PersistentVolume and PersistentVolumeClaim.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

    All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

    Create a persistent volume

    kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
    kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

    Create a persistent volume claim

    kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
    kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

    In the od.config file, set the values

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

    If you need to use subPath

    desktop.persistentvolumeclaimforcesubpath: True\n

    'subPath' is not supported for ephemeral container.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

    in od.config file

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

    Replace mystorageclass by storageclass of your cloud provider.

    To list the storage classes

    kubectl get storageclass\n
    • The example output is as follows on the cloud provider aws.
    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
    • The example output is as follows on the cloud provider digitalocean.
    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

    Value defines inside {{ VALUE }} is replaced by the templated value keys:

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

    The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

    desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    The variables persistentvolumeclaim and persistentvolume become

    desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
    "},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

    During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

    The default value for desktop.removepersistentvolume is False.

    "},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

    During the remove desktop process, delete or not the persistent volume claim.

    The default value for desktop.removepersistentvolumeclaim is False.

    "},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

    In this example, we use nfs protocol to share user home directory on each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.1/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaim

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistent volume claim features.
    • desktop.persistentvolume: create a new persistent volume.
    • desktop.persistentvolumeclaim create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

    Update the new config file and restart pyos pods. Update the pyos role to allow

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    abcdesktop creates PV and PVC for you.

    "},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.1/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

    Get the persistent volume claim's description

    kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

    Get the persistent volume description

    kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
    "},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

    Update od.config file with the options

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

    Update the configmap

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to your abcdesktop service, you should read on the html page, the status

    b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

    Read the new pod for fry the user fry

    kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

    Read the pvc for fry

    kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

    Read the pv for fry

    kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
    "},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

    When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

    kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
    kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
    kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
    "},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

    Clone kube-tools and run km --apply as root.

    git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

    kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

    Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    "},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.1.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n

    Run install-3.1.sh

    ./install-3.1.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.1.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.1 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.1 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

    The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
    kubectl logs -l run=nginx-od -n abcdesktop\n
    "},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
    running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

    Nginx has failed to start. There is an error in the configuration file.

    We need to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n

    Check that nginx pod is Running

    kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

    Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

    Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

    kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

    Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

    nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

    It's time to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

    The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
    kubectl logs -l run=pyos-od -n abcdesktop\n
    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    It's time to fix the abcdesktop-config ConfigMap.

    "},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n

    Check that pyos pod is Running

    kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

    Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

    Run the command cd /var/pyos && ./od.py

    kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

    od.py command returns the same explicit error, the od.config file is wrong.

    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    We need to fix the abcdesktop-config ConfigMap in the yaml file.

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.A.sh bash script using a curl.

    "},{"location":"3.1/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n

    Run the uninstall-3.1.sh command line with your own namespace

    ./uninstall-3.1.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume
    • PersistentVolumeClaim

    In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

    • abcdestkop has a Persistent Volume Claim support.

    Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

    "},{"location":"3.2/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

    Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

    - apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

    Update the default pyos role to ClusterRole

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    "},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

    To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
    "},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

    To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

    desktop.homedirectorytype: 'persistentVolumeClaim'\n
    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

    desktop.persistentvolume is optional, the default value is None. desktop.persistentvolume can be None, or a string or a dict.

    If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

    If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.

    If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume. The dict values of persistent volume support template values.

    For example :

    desktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

    desktop.persistentvolumeclaim is optional, the default value is None. The type of desktop.persistentvolumeclaim can be None, or a string or a dict.

    If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a string.

    Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

    if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

    Get more information about PersistentVolume and PersistentVolumeClaim.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

    All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

    Create a persistent volume

    kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
    kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

    Create a persistent volume claim

    kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
    kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

    In the od.config file, set the values

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

    If you need to use subPath

    desktop.persistentvolumeclaimforcesubpath: True\n

    'subPath' is not supported for ephemeral container.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

    in od.config file

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

    Replace mystorageclass by storageclass of your cloud provider.

    To list the storage classes

    kubectl get storageclass\n
    • The example output is as follows on the cloud provider aws.
    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
    • The example output is as follows on the cloud provider digitalocean.
    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

    Value defines inside {{ VALUE }} is replaced by the templated value keys:

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

    The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

    desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    The variables persistentvolumeclaim and persistentvolume become

    desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
    "},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

    During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

    The default value for desktop.removepersistentvolume is False.

    "},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

    During the remove desktop process, delete or not the persistent volume claim.

    The default value for desktop.removepersistentvolumeclaim is False.

    "},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

    In this example, we use nfs protocol to share user home directory on each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.2/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaim

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistent volume claim features.
    • desktop.persistentvolume: create a new persistent volume.
    • desktop.persistentvolumeclaim create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

    Update the new config file and restart pyos pods. Update the pyos role to allow

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    abcdesktop creates PV and PVC for you.

    "},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.2/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

    Get the persistent volume claim's description

    kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

    Get the persistent volume description

    kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
    "},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

    Update od.config file with the options

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

    Update the configmap

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to your abcdesktop service, you should read on the html page, the status

    b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

    Read the new pod for fry the user fry

    kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

    Read the pvc for fry

    kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

    Read the pv for fry

    kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath","text":"

    desktop.persistentvolumeclaimforcesubpath is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath is False

    If desktop.persistentvolumeclaimforcesubpath is set to True then persistentvolumeclaim is mounted with the subPath option.

    Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath to True.

    If you try to start an ephemeral container application, you get an error code 422 and the message

    { \n    \"reason\":\"FieldValueForbidden\",\n    \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n    \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
    "},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath option","text":"

    In this case :

    • User's home directory are hosted on a nfs server
    • The nfs server (192.168.7.101) exports /volume1/home
    • The nfs server allows user to access subfolders

    We create the unique PersistentVolume named pv-nfs.

    ---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  annotations:\n    pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n  name: pv-nfs\nspec:\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadWriteMany\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: nfs-csi\n  mountOptions:\n    - nfsvers=3\n  csi:\n    driver: nfs.csi.k8s.io\n    readOnly: false\n    # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n    # make sure this value is unique for every share in the cluster\n    volumeHandle: nfs-server.default.svc.cluster.local/share##\n    volumeAttributes:\n      server: 192.168.7.101\n      share: /volume1/home\n---\n

    accessModes is ReadWriteMany for the PersistentVolume

    We create the unique PersistentVolumeClaim named pvc-nfs-homedir

    ---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: pvc-nfs-homedir\n  namespace: abcdesktop\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 10Gi\n  volumeName: pv-nfs\n  storageClassName: nfs-csi\n---\n

    accessModes is ReadWriteMany for the PersistentVolumeClaim

    We define in od.config file

    desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n

    All pods share the same PersistentVolumeClaim named pvc-nfs-homedir, the desktop.persistentvolumeclaimforcesubpath is set to True, the subPath value is set with the default of the current LDAP userid. So the user's home directory is /volume1/home/{{ userid }}. The nfs server allows user to access subfolders, the mount operation is permitted.

    "},{"location":"3.2/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.2/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

    When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

    kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
    kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
    kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
    "},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"

    Play sound from a container to web browser using WebRTC

    "},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":"
    • Read the introduction to WebRTC protocols

    • You need a STUN server. You can use any STUN server like stun.l.google.com:19302. Session Traversal Utilities for NAT (STUN) is a protocol to discover your public address and determine any restrictions in your router that would prevent a direct connection with a peer.

    • You need your own TURN server. We use COTURN server as describe in this chapter. Traversal Using Relays around NAT (TURN) is meant to bypass the Symmetric NAT restriction by opening a connection with a TURN server and relaying all information through that server.

    "},{"location":"3.2/config/webrtc/#webrtc-design","title":"WebRTC design","text":"

    abcdesktop/pulseaudio:3.2 container executes the following services

    • WebRTC Signalling service
    • WebRTC gstreamer webrtcbin
    • Pulseaudio service
    "},{"location":"3.2/config/webrtc/#stun-server","title":"STUN server","text":"

    STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.

    The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good

    { 'urls': 'stun:stun.l.google.com:19302' }\n
    "},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"

    The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.

    You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.

    "},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"

    coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.

    • Coturn installation
    apt-get install coturn \n
    • use SSL certificates

    You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.

    • Minimal COTURN configuration file

    Default minimal configuration file /etc/turnserver.conf for abcdesktop.

    listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n

    Update the following configuration file with you own values

    • static-auth-secret
    • server-name
    • realm
    • cert
    • pkey

    Then start your turn service.

    "},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmap od.config file","text":"

    Add new webrtc's entries

    • Set webrtc.enable to True
    • define webrtc.rtc_configuration dictionary for the web browser webrtc stack
    • define webrtc.coturn dictionnay entries for the web browser webrtc stack
    • coturn_static_auth_secret is the static-auth-secret value define in turnserver.conf file
    • ttl define the time to live for the auth value
    • protocol define the Traversal Using Relays around NAT protocol, value can be turn or turns
    • url url for the coturn service
    webrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n  'coturn_static_auth_secret': 'CHANGEME', \n  'ttl':3600,\n  'protocol': 'turns',\n  'url': 'turn.domain.local:3478' }\n

    pyos merges a new rtc_configuration json document from the webrtc.coturn and from webrtc.coturn values.

    pyos adds username and credential entries. For example, a new rtc_configuration json document is send to the web browser

    {\n  \"iceServers\": [\n    { \"urls\": \"stun:stun.l.google.com:19302\" },\n    { \"urls\": \"turns:nturns.domain.local:3478\",\n      \"username\": \"1703086872\",\n      \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n  ]\n}\n
    • Update the default environment variable desktop.envlocal to add STUN_SERVER

    STUN_SERVER value is used by the gstreamer webrtcbin

    desktop.envlocal :  { \n  'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n
    • Update the sound entry in desktop.pod to enable pulseaudio service

    Update the value 'enable': False to 'enable': True

    desktop.pod : \n\n    ...[CUT HERE ]...\n\n'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.2',\n    'pullpolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n        'requests': { 'memory': \"8Mi\", 'cpu': \"50m\"  },  \n        'limits'  : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n    } },\n\n    ...[CUT HERE ]...\n\n
    • Apply the new configmap abcdesktop-config for the od.config file
    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    • Restart pyos pod instance
    kubectl delete pods -l run=pyos-od -n abcdesktop\n
    "},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"

    Open your web browser, and go to your abcdesktop web site.

    Make sure to use secured https protocol, else WebRTC is disabled.

    "},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"

    Login using credentials, for example

    The sound is not yet available

    "},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"

    Few seconds later, sound becomes available.

    The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.

    "},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"

    Open a Terminal Web Shell application and run the command inside the web shell

    paplay /usr/share/sounds/alsa/Rear_Center.wav \n

    You should heard Rear Center on your local sound device

    "},{"location":"3.2/config/webrtc/#test-microphone-access","title":"Test microphone access","text":"

    Open a Terminal Web Shell application and run the command inside the web shell

    pavumeter --record\n

    You should see cursor changes if you talk to your abcdesktop

    "},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"

    Open the web browser's console log to read the WebRTC messages

    Read the json rtc_configuration document created by pyos pod

    Read the step Created peer connection for call and creating SDP and step Exchange from foundation for 1 to 6

    Read the step Exchange from foundation from 6 to 9

    Read the step Local stream answer

    The last line is ICE Candidate was null, done

    The sound is now enabled

    "},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

    Clone kube-tools and run km --apply as root.

    git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

    kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

    Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n

    Run install-3.2.sh

    ./install-3.2.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.2.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.2.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-x89kq   1/1     Running   0          11s\nmongodb-od-77c945467d-c5cw4     1/1     Running   0          11s\nnginx-od-86c5dfcc67-nfvbq       1/1     Running   0          11s\nopenldap-od-5bbdd75864-mzzmh    1/1     Running   0          11s\npyos-od-7646bf4786-c2hdm        1/1     Running   0          11s\nspeedtest-od-7f5484966f-6t4b2   1/1     Running   0          11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.2.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1 -OutFile install-3.2.ps1\n

    Run install-3.2.ps1

    .\\install-3.2.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-98t4t   1/1     Running   0          23s\nmongodb-od-77c945467d-v4k58     1/1     Running   0          23s\nnginx-od-7c7bf5bf48-khtvg       1/1     Running   0          23s\nopenldap-od-56b6564c85-t56tj    1/1     Running   0          21s\npyos-od-644c98bcd5-8gqzd        1/1     Running   0          23s\nspeedtest-od-894b7c886-fgt6v    1/1     Running   0          23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.2.sh bash script using a curl.

    "},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n

    Run the uninstall-3.2.sh command line with your own namespace

    ./uninstall-3.2.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n

    Run the uninstall-3.2.ps1 command line with your own namespace

    .\\uninstall-3.2.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.3/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.3/config/networkpolicy/#goals","title":"Goals","text":"
    • Apply network policies to control traffic flow at the IP address or port level of abcdesktop pods, this includes user's pods.
    "},{"location":"3.3/config/networkpolicy/#authors","title":"Authors","text":"

    jpxavier-oio has designed the network policy for abcdesktop.io

    "},{"location":"3.3/config/networkpolicy/#requirements","title":"Requirements","text":"
    • You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes.
    • Network policies are implemented by the network plugin. To use network policies, you must be using a networking solution which supports NetworkPolicy.
    "},{"location":"3.3/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

    There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

    • The NetworkPolicy rights contains egress and ingress for pod selected by tag. rights means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.

    • The NetworkPolicy permits contains egress to a pod selected by tag. The NetworkPolicy permits means permit access to this pod.

    "},{"location":"3.3/config/networkpolicy/#apply-the-default-netpol-default-33yaml-file","title":"Apply the default netpol-default-3.3.yaml file","text":"

    To apply the network policies run the command :

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default-3.3.yaml\n

    The command returns

    networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/router-rights created\nnetworkpolicy.networking.k8s.io/router-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
    "},{"location":"3.3/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
    • Login to your abcdesktop
    • Open a webshell and run a curl command.
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    This http request is denied by the network policy and you should get an error message

    You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

    "},{"location":"3.3/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

    To disable the network policies, run the kubectl delete command :

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default-3.3.yaml\n
    • Login to your abcdesktop
    • Open the web shell to run the same curl command
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    You should get a json document as http response

    {}\n

    You may need to update the netpol-default.yaml file with your own values.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/","title":"abcdesktop installation","text":""},{"location":"3.3/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-vbbb7     1/1     Running   0          32s\nmemcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s\nmongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s\nnginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s\nopenldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s\npyos-od-8d4988b56-vcd7z         1/1     Running   0          32s\nrouter-od-f5458658-b52hj        1/1     Running   0          33s\nspeedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.sh\nchmod 755 install-3.3.sh \n

    Run install-3.3.sh

    ./install-3.3.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[OK] default account is created\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[OK] pyos-serviceaccount account is created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready\n[OK] pod/console-od-79bf9bf475-gbb62 condition met\n[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready\n[OK] pod/memcached-od-d4b6b6867-c8b4p condition met\n[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready\n[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met\n[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready\n[OK] pod/nginx-od-57dccb8cf9-txgzc condition met\n[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready\n[OK] pod/openldap-od-6955699d5-qhjzr condition met\n[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready\n[OK] pod/pyos-od-777747f64b-r87x5 condition met\n[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready\n[OK] pod/router-od-59d67d664f-f56m8 condition met\n[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready\n[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-gbb62     1/1     Running   0          12s\nmemcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s\nmongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s\nnginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s\nopenldap-od-6955699d5-qhjzr     1/1     Running   0          12s\npyos-od-777747f64b-r87x5        1/1     Running   0          13s\nrouter-od-59d67d664f-f56m8      1/1     Running   0          13s\nspeedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n\n[OK] Please open your web browser and connect to http://localhost:30443/\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.3/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-3-download-and-create-the-abcdesktop-config-file","title":"Step 3: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-4-create-the-abcdesktop-pods-and-services","title":"Step 4: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s\nmemcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s\nmongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s\nnginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s\nopenldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s\npyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s\nrouter-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s\nspeedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -l type=x11server -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME              READY   STATUS    RESTARTS   AGE\nanonymous-c44fc   4/4     Running   0          116s\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.3.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.3.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.3.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-pghrs     1/1     Running   0          12s\nmemcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s\nmongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s\nnginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s\nopenldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s\npyos-od-8d4988b56-7bg5z         1/1     Running   0          12s\nrouter-od-f5458658-znwcg        1/1     Running   0          12s\nspeedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1\n

    Run install-3.3.ps1

    .\\install-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-zqbdq     1/1     Running   0          22s\nmemcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s\nmongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s\nnginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s\nopenldap-od-6955699d5-rl8rd     1/1     Running   0          21s\npyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s\nrouter-od-c9fd4c987-xvcbq       1/1     Running   0          22s\nspeedtest-od-67db77f86f-6fftb   1/1     Running   0          22s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.3/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.3/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-33","title":"Command to uninstall abcdesktop release 3.3","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.3.sh bash script using a curl.

    "},{"location":"3.3/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.3/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.3/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.sh\nchmod 755 uninstall-3.3.sh\n

    Run the uninstall-3.3.sh command line with your own namespace

    ./uninstall-3.3.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.3/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.3/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.3/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1\n

    Run the uninstall-3.3.ps1 command line with your own namespace

    .\\uninstall-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/","title":"abcdesktop installation","text":""},{"location":"3.4/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.4.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-vbbb7     1/1     Running   0          32s\nmemcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s\nmongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s\nnginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s\nopenldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s\npyos-od-8d4988b56-vcd7z         1/1     Running   0          32s\nrouter-od-f5458658-b52hj        1/1     Running   0          33s\nspeedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.4.sh\nchmod 755 install-3.4.sh \n

    Run install-3.4.sh

    ./install-3.4.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[OK] default account is created\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[OK] pyos-serviceaccount account is created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready\n[OK] pod/console-od-79bf9bf475-gbb62 condition met\n[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready\n[OK] pod/memcached-od-d4b6b6867-c8b4p condition met\n[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready\n[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met\n[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready\n[OK] pod/nginx-od-57dccb8cf9-txgzc condition met\n[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready\n[OK] pod/openldap-od-6955699d5-qhjzr condition met\n[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready\n[OK] pod/pyos-od-777747f64b-r87x5 condition met\n[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready\n[OK] pod/router-od-59d67d664f-f56m8 condition met\n[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready\n[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-gbb62     1/1     Running   0          12s\nmemcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s\nmongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s\nnginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s\nopenldap-od-6955699d5-qhjzr     1/1     Running   0          12s\npyos-od-777747f64b-r87x5        1/1     Running   0          13s\nrouter-od-59d67d664f-f56m8      1/1     Running   0          13s\nspeedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n\n[OK] Please open your web browser and connect to http://localhost:30443/\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.4/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-3-download-and-create-the-abcdesktop-config-file","title":"Step 3: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-4-create-the-abcdesktop-pods-and-services","title":"Step 4: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.4.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s\nmemcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s\nmongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s\nnginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s\nopenldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s\npyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s\nrouter-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s\nspeedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -l type=x11server -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME              READY   STATUS    RESTARTS   AGE\nanonymous-c44fc   4/4     Running   0          116s\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.4.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.4.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.3.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.4.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-pghrs     1/1     Running   0          12s\nmemcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s\nmongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s\nnginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s\nopenldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s\npyos-od-8d4988b56-7bg5z         1/1     Running   0          12s\nrouter-od-f5458658-znwcg        1/1     Running   0          12s\nspeedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1\n

    Run install-3.3.ps1

    .\\install-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-zqbdq     1/1     Running   0          22s\nmemcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s\nmongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s\nnginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s\nopenldap-od-6955699d5-rl8rd     1/1     Running   0          21s\npyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s\nrouter-od-c9fd4c987-xvcbq       1/1     Running   0          22s\nspeedtest-od-67db77f86f-6fftb   1/1     Running   0          22s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.4/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.4/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-34","title":"Command to uninstall abcdesktop release 3.4","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.4.sh bash script using a curl.

    "},{"location":"3.4/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.4/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.4.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.4/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.4.sh\nchmod 755 uninstall-3.4.sh\n

    Run the uninstall-3.4.sh command line with your own namespace

    ./uninstall-3.4.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.4/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.4/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.4/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1\n

    Run the uninstall-3.3.ps1 command line with your own namespace

    .\\uninstall-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":"
    • Alexandre DEVELY : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base

    • Cedric HAUWEL : Control Plane PyOS and authentification, included a complete refactor of the control plane

    • Jeremy PETIT : HTML, CSS, Javascript, nodejs: Full Stack Javascript Developer

    • Kevin VOYER : HTML, CSS, Javascript, Firefox clipboard extension, nodejs : Full Stack Javascript Developer

    • Vincent PENVERN : Python, Ansible, Firefox clipboard extension, Pyos and embedded applications

    • Franck SEROT : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base

    • Jean-Philippe XAVIER: Architect, design and network policies with calico

    "},{"location":"about/authors/#other-contributors","title":"Other Contributors","text":"

    The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.

    "},{"location":"about/gnu-gpl-v2.0/","title":"GNU General Public License","text":"

    Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

    Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

    "},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"

    The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

    When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

    To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

    For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

    We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

    Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

    Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

    The precise terms and conditions for copying, distribution and modification follow.

    "},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"

    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

    • a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
    • b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
    • c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

    • a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    • b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    • c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    "},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"

    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \u201cAS IS\u201d WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    END OF TERMS AND CONDITIONS

    "},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"

    If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

    To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year>  <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n

    Also add information on how to contact you by electronic and paper mail.

    If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n

    The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.

    You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:

    Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n

    This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.

    "},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"

    The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.

    We recommend you to start in docker mode first with the Setup Guide in docker mode.

    Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide

    You can also, read the genesis chapters GUI apps on Docker.

    Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.

    "},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"

    Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.

    Topics include:

    • Fundamentals of abcdesktop.io
    • Deploy abcdesktop.io using docker-composer
    • Defined docker image application
    • Build your own application
      • Use standard GNU/Linux Application
      • Use Microsoft Windows Application with Wine
    "},{"location":"about/howreadthisdoc/#the-advanced-of-abcdesktopio","title":"The Advanced of abcdesktop.io","text":"

    This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.

    Topics include:

    • Deploy abcdesktop.io using Kubernetes
    • Storage and Kubernetes drivers
      • Legacy Files server (CIFS, NFS, WebDav)
      • Amazon/S3, Ceph
    • Roles
    • Security
    • Networking Policies
    • Orchestration
    • LoadBalancing
    • Logging with GrayLog
    • Garbage collector
    "},{"location":"about/howtodolabsexercices/","title":"How to do the labs and exercices","text":"

    abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :

    Operating System Recommended version GNU/Linux Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X Catalina version 10.15.3 (and above) Windows 10 Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop or server","text":"
    • If you choose server, please translate the URL request http://localhost with the hostname of your server.

    For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL request http://localhost with http://server01.labs.domain.local

    Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.

    • If you choose desktop, the URL request http://localhost will reach your local services.
    "},{"location":"about/opensource/","title":"Open Source","text":""},{"location":"about/opensource/#abcdesktopio-is-an-open-source-project","title":"abcdesktop.io is an open source project","text":"

    abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.

    Follow the Fork me on github links, to get access to each repository.

    If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.

    "},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"

    abcdesktop.io deplend on a lot of open source diffrents projets.

    "},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"

    Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.

    • http://wiki.ros.org/docker/Tutorials/GUI
    • https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.
    • https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.
    • HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.
    • https://www.kasmweb.com
    • https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.
    • Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.
    • kube-desktop
    "},{"location":"about/play_sound_in_docker/","title":"Play sound inside a docker to a web browser","text":""},{"location":"about/play_sound_in_docker/#sound-in-docker-is-the-big-challenge","title":"Sound in docker is the big challenge","text":"

    As VNC does not support sound, we have to forward a Pulseaudio null-sink output to the user browser, with no latency.

    • Release 1.0 : use the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    • Release 2.0 : use janus webrtc gateway, send pulseaudio rtp stream to janus, and play sound using the web browser webrtc stack (good sound quality)

    • Release 3.0 : use virtual microphone using gstreamer and pulseaudio

    Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented

    "},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"
    • webaudio-wav-stream-player No latency wav stream player using browser fetch streaming API and WebAudio

    • Pulseaudio with module-http-protocol-tcp A proof-of-concept HTTP module, which can be used to introspect the current status of the PulseAudio daemon using HTTP. Just load this module and point your browser to http://localhost:4714/. This module takes the same arguments as module-cli-protocol-tcp.

    • Create Pulseaudio null-sink

    # defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n

    Then use

    load-module module-http-protocol-tcp\n

    Read the http stream data, using fetch call :

    • $target is the container Ip Address
    • $pulseaudio_http_port is the pulseaudio http port ( by default, the http port vallue is
    http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n

    Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js file :

    //\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n    // // total header : 4 + 26 + 12 + 8 = 50 \n    // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n    var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n    var total_length =  header_length + data.byteLength;\n\n    // bitsPerSample MUST BE  8 bits\n\n    // The default byte ordering assumed for WAVE data files is little-endian.\n    var header = new ArrayBuffer(header_length); \n    var d = new DataView(header);\n\n    d.setUint8(0, \"R\".charCodeAt(0)); \n    d.setUint8(1, \"I\".charCodeAt(0));\n    d.setUint8(2, \"F\".charCodeAt(0));\n    d.setUint8(3, \"F\".charCodeAt(0));\n\n    // All integers MUST be set in bigEndian format\n    // Wave chunks containing format information and sampled data\n    // cksize   4   Chunk size: 4+n  \n    // 4: for sizeof( 'WAVE' ) + n \n    // n: Wave chunks containing format information and sampled data\n    //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n    //bitsPerSample data.byteLength + 8+16+12\n    d.setUint32(4, total_length, true); \n\n    // write 4 bytes\n    d.setUint8(8,  \"W\".charCodeAt(0)); \n    d.setUint8(9,  \"A\".charCodeAt(0)); \n    d.setUint8(10, \"V\".charCodeAt(0)); \n    d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n    // write 4 bytes\n    d.setUint8(12, \"f\".charCodeAt(0));\n    d.setUint8(13, \"m\".charCodeAt(0));\n    d.setUint8(14, \"t\".charCodeAt(0));\n    d.setUint8(15, \" \".charCodeAt(0));\n\n\n    // All integers MUST be set in bigEndian format\n\n\n    // Subchunk1Size 16 for PCM.  \n    // Offset 16    \n    // Size 4\n    // This is the size of the rest of the Subchunk which follows this number.\n    // The size of the rest of this subchunk.\n    // All integers MUST be set in bigEndian format\n    // d.setUint32(16, 16, true);\n    // cksize   4   Chunk size: 16, 18 or 40 \n    var chunksize = 18;\n    d.setUint32(16, chunksize, true);\n\n    // The format of the wave data, which will be 1 for uncompressed PCM data.\n    // All integers MUST be set in bigEndian format\n    // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n    d.setUint16(20, format, true);\n\n    // Indicates if the data is mono, stereo, or something else.\n    // NumChannels Mono = 1, Stereo = 2, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint16(22, numberOfChannels, true);\n\n    // The sample rate per second.\n    // SampleRate 8000, 44100, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint32(24, sampleRate, true);\n\n    // byteRate == SampleRate * NumChannels * BitsPerSample/8\n    // All integers MUST be set in bigEndian format\n    var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n    d.setUint32(28, byteRate, true ); \n\n    // blockAlign       == NumChannels * BitsPerSample/8\n    // The number of bytes for one sample including all channels.\n    var blockAlign = numberOfChannels * bitsPerSample / 8; \n     // All integers MUST be set in bigEndian format\n    d.setUint16(32, blockAlign, true ); \n\n    // BitsPerSample    8 bits = 8, 16 bits = 16, etc.\n    d.setUint16(34, bitsPerSample, true);\n\n    // Wave files may include an additional field, usually reserved for non-PCM formats:\n    // bits per Sample \n    // Size of the extension \n    // 2 bytes\n    // Offset \n    var cbSize = 0;\n    d.setUint16(36, cbSize, true);\n\n    d.setUint8(38, \"f\".charCodeAt(0));\n    d.setUint8(39, \"a\".charCodeAt(0));\n    d.setUint8(40, \"c\".charCodeAt(0));\n    d.setUint8(41, \"t\".charCodeAt(0));\n    var cksize = 4;\n    d.setUint32(42, cksize, true);\n    var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n    d.setUint32(46, dwSampleLength, true);\n\n// 50\n    d.setUint8(50, \"d\".charCodeAt(0));\n    d.setUint8(51, \"a\".charCodeAt(0));\n    d.setUint8(52, \"t\".charCodeAt(0));\n    d.setUint8(53, \"a\".charCodeAt(0));\n\n    d.setUint32(54, data.byteLength, true);\n\n//58\n    // data must pad byte 0 or 1 if n is odd\n    return concat(header, data);\n}\n

    Then use the WavPlayer.js from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()

    This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10

    It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.

    "},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"
    • Janus WebRTC Gateway with ICE server. Janus act as WebRTC gateway, listen for udp RTP stream from Pulseaudio and forward it to user web browser.

    • Pulseaudio with module-rtp-send Create a null-sink formated alaw and send it to the WebRTC gateway udp port on localhost.

    ### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n

    Add a RTP stream to Janus WebRTC gateway

    [pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n

    Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC

    "},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"

    The current documentation version is 0.1

    "},{"location":"about/version/#location","title":"Location","text":"

    This documentation is located at https://github.com/abcdesktopio/docs

    "},{"location":"about/version/#installing-make","title":"Installing Make","text":"

    Install the Make package using apt-get

    sudo apt-get install make\n
    "},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"

    Install the mkdocs package using the Makefile:

    make install\n

    make install command runs :

    • pip install mkdocs
    • pip install mkdocs-material

    Make sure that the pip command is installed on you system.

    "},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"
    git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO    -  Cleaning site directory \nINFO    -  Building documentation to directory: /home/alex/src/docs/opsdocs/site \n

    All HTML files are located in the building documentation directory

    "},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"
    make serve\nINFO    -  Serving on http://127.0.0.1:8000\nINFO    -  Start watching changes\nINFO    -  Start detecting changes\n

    Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.

    "},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"

    {\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}

    https://ocv5.pepins.net/API/composer/launchdesktop

    {\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}

    "},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"

    Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/

    "},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"

    DockerFile generator from json file to build applications images run commands

    $ make dockerfile\n$ make build\n

    this command build all generated Dockerfile

    To build documentation files

    $ make docs\n

    this command build all md files, and build list.md

    "},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"
    gnome-2048\n
    "},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"
    2048 (alpine gtk) with error\n
    "},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"
    /usr/bin/gnome-2048\n
    "},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"
    org.gnome.TwentyFortyEight.Gnome-2048\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-alpine-error/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine-error\",\n    \"displayname\": \"2048 (alpine gtk) with error\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    }\n}\n
    "},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
    "},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-alpine-error

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
    "},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
    "},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
    "},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"
    gnome-2048\n
    "},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"
    2048 (alpine gtk)\n
    "},{"location":"applications/2048-alpine/#path","title":"Path","text":"
    /usr/bin/gnome-2048\n
    "},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"
    org.gnome.TwentyFortyEight.Gnome-2048\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-alpine/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"

    json source file 2048-alpine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine\",\n    \"displayname\": \"2048 (alpine gtk)\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"showinview\": \"dock\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"64M\",\n        \"pid_mode\": false,\n        \"network_mode\": \"none\"\n    }\n}\n
    "},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
    "},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-alpine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
    "},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
    "},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
    "},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"
    2048-qt\n
    "},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"
    2048 (ubuntu qt)\n
    "},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"
    /usr/games/2048-qt\n
    "},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"
    2048-qt.2048-qt\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-ubuntu/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/2048-qt.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    ENV QT_X11_NO_MITSHM=1\n
    "},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"

    json source file 2048-ubuntu.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048-ubuntu\",\n    \"displayname\": \"2048 (ubuntu qt)\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"postruncommands\": [\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ]\n}\n
    "},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
    "},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-ubuntu

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
    "},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
    "},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
    "},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"

    2048-qt

    "},{"location":"applications/2048/#display-name","title":"Display name","text":"

    \"2048\"

    "},{"location":"applications/2048/#path","title":"path","text":"

    \"/usr/games/2048-qt\"

    "},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.22.04

    "},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"
    openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
    "},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"

    \"-configuration .eclipse/1988419495_linux_gtk_x86_64\"

    "},{"location":"applications/apachedirectorystudio/#displayname","title":"Displayname","text":"
    Apache Directory Studio\n
    "},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"
    /usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
    "},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"
    Apache Directory Studio.Apache Directory Studio\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/apachedirectorystudio/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
    "},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"

    json source file apachedirectorystudio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n        \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n        \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n    ],\n    \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n    \"icon\": \"account.svg\",\n    \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n    \"installrecommends\": true,\n    \"keyword\": \"ldap\",\n    \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n    \"name\": \"apachedirectorystudio\",\n    \"displayname\": \"Apache Directory Studio\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
    "},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
    "},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application apachedirectorystudio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
    "},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
    "},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
    "},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"
    astromenace\n
    "},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"
    astromenace\n
    "},{"location":"applications/astromenace/#path","title":"Path","text":"
    /usr/games/AstroMenace\n
    "},{"location":"applications/astromenace/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"
    Astromenace.Astromenace\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/astromenace/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/astromenace.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"

    json source file astromenace.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"astromenace\",\n    \"installrecommends\": true,\n    \"icon\": \"astromenace.svg\",\n    \"launch\": \"Astromenace.Astromenace\",\n    \"name\": \"astromenace\",\n    \"displayname\": \"astromenace\",\n    \"path\": \"/usr/games/AstroMenace\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
    "},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
    "},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application astromenace

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
    "},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
    "},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
    "},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"

    libxss1 atom aspell

    "},{"location":"applications/atom/#arguments","title":"Arguments","text":"

    \"-f\"

    "},{"location":"applications/atom/#display-name","title":"Display name","text":"

    \"Atom\"

    "},{"location":"applications/atom/#path","title":"path","text":"

    \"/usr/bin/atom\"

    "},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"
    \nRUN apt-get update && apt-get install  --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install                          --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install  --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/base/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/base/#arguments","title":"Arguments","text":"

    \"--base\"

    "},{"location":"applications/base/#displayname","title":"Displayname","text":"
    Base\n
    "},{"location":"applications/base/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/base/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
    "},{"location":"applications/base/#file-extensions","title":"File extensions","text":"

    \"odb\"

    "},{"location":"applications/base/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odb\"

    "},{"location":"applications/base/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-base\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/base/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-base.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/base/#json-dump","title":"JSON dump","text":"

    json source file base.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_base.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-base\",\n    \"name\": \"base\",\n    \"displayname\": \"Base\",\n    \"args\": \"--base\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n    \"fileextensions\": \"odb\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"odb\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
    "},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application base

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
    "},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f base.d -t base .\n
    "},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
    "},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"

    \"--no-sandbox\"

    "},{"location":"applications/beekeeperstudio/#displayname","title":"Displayname","text":"
    Beekeeper-studio\n
    "},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"
    /opt/Beekeeper-Studio/beekeeper-studio\n
    "},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"

    \"sql\"

    "},{"location":"applications/beekeeperstudio/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"sql\"

    "},{"location":"applications/beekeeperstudio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"
    beekeeper-studio.beekeeper-studio\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/beekeeperstudio/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/beekeeper-studio.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
    "},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"

    json source file beekeeperstudio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\",\n        \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n        \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n        \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n        \"ENV ELECTRON_ENABLE_LOGGING=true\",\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"beekeeper-studio.svg\",\n    \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n    \"launch\": \"beekeeper-studio.beekeeper-studio\",\n    \"name\": \"beekeeperstudio\",\n    \"displayname\": \"Beekeeper-studio\",\n    \"installrecommends\": false,\n    \"forceconfold\": true,\n    \"host_config\": {\n        \"shm_size\": \"2G\",\n        \"ipc_mode\": \"shareable\"\n    },\n    \"args\": \"--no-sandbox\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"legacyfileextensions\": \"sql\",\n    \"fileextensions\": \"sql\",\n    \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
    "},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application beekeeperstudio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
    "},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
    "},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
    "},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/blender/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"
    blender mesa-dri-gallium\n
    "},{"location":"applications/blender/#displayname","title":"Displayname","text":"
    Blender\n
    "},{"location":"applications/blender/#path","title":"Path","text":"
    /usr/bin/blender\n
    "},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"
    application/x-blender\n
    "},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"

    \"blend,obj,fbx,3ds,ply,stl\"

    "},{"location":"applications/blender/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"
    Blender.Blender\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/blender/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/blender.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"

    json source file blender.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,graphics\",\n    \"apkpackage\": \"blender mesa-dri-gallium\",\n    \"icon\": \"circle_blender.svg\",\n    \"keyword\": \"blender,modeler\",\n    \"launch\": \"Blender.Blender\",\n    \"name\": \"blender\",\n    \"displayname\": \"Blender\",\n    \"path\": \"/usr/bin/blender\",\n    \"mimetype\": \"application/x-blender\",\n    \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
    "},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
    "},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application blender

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
    "},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
    "},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
    "},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/bless/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"
    bless\n
    "},{"location":"applications/bless/#path","title":"Path","text":"
    /usr/bin/bless\n
    "},{"location":"applications/bless/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"
    bless.Bless\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/bless/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/bless.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"

    json source file bless.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"bless\",\n    \"icon\": \"circle_bless.svg\",\n    \"keyword\": \"hexa,decimal\",\n    \"launch\": \"bless.Bless\",\n    \"name\": \"Bless\",\n    \"path\": \"/usr/bin/bless\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
    "},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
    "},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Bless

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
    "},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
    "},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
    "},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/blobby/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"
    blobby\n
    "},{"location":"applications/blobby/#path","title":"Path","text":"
    /usr/games/blobby\n
    "},{"location":"applications/blobby/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"
    blobby.blobby\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/blobby/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/blobby.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"

    json source file blobby.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"blobby\",\n    \"icon\": \"blobby.svg\",\n    \"installrecommends\": false,\n    \"keyword\": \"game\",\n    \"launch\": \"blobby.blobby\",\n    \"name\": \"blobby\",\n    \"path\": \"/usr/games/blobby\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
    "},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
    "},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application blobby

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
    "},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
    "},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
    "},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/boxes/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"
    gnome-boxes sudo\n
    "},{"location":"applications/boxes/#displayname","title":"Displayname","text":"
    Gnome-boxes\n
    "},{"location":"applications/boxes/#path","title":"Path","text":"
    /usr/bin/gnome-boxes\n
    "},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"
    application-x-cd-image;\n
    "},{"location":"applications/boxes/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"
    gnome-boxes.Gnome-boxes\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/boxes/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Boxes.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"

    json source file boxes.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"org.gnome.Boxes.svg\",\n    \"apkpackage\": \"gnome-boxes sudo\",\n    \"keyword\": \"boxes,vm\",\n    \"launch\": \"gnome-boxes.Gnome-boxes\",\n    \"name\": \"boxes\",\n    \"displayname\": \"Gnome-boxes\",\n    \"path\": \"/usr/bin/gnome-boxes\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n    \"mimetype\": \"application-x-cd-image;\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"securitycontext\": {\n        \"allowPrivilegeEscalation\": true,\n        \"capabilities\": {\n            \"add\": [\n                \"NET_ADMIN\",\n                \"CAP_SYS_ADMIN\"\n            ]\n        }\n    }\n}\n
    "},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
    "},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application boxes

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
    "},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
    "},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
    "},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/brackets/#arguments","title":"Arguments","text":"

    \"--no-sandbox --disable-gpu\"

    "},{"location":"applications/brackets/#path","title":"Path","text":"
    /opt/brackets/Brackets\n
    "},{"location":"applications/brackets/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"
    brackets.Brackets\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/brackets/#desktopfile","title":"Desktopfile","text":"
    /opt/brackets/brackets.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"

    json source file brackets.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_brackets.svg\",\n    \"keyword\": \"html,brackets\",\n    \"launch\": \"brackets.Brackets\",\n    \"name\": \"Brackets\",\n    \"path\": \"/opt/brackets/Brackets\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\"\n    },\n    \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"args\": \"--no-sandbox  --disable-gpu\"\n}\n
    "},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
    "},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox  --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox  --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Brackets

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
    "},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
    "},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
    "},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/calc/#distribution","title":"Distribution","text":"

    alpine

    "},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/calc/#arguments","title":"Arguments","text":"

    \"--calc\"

    "},{"location":"applications/calc/#displayname","title":"Displayname","text":"

    \"Calc\"

    "},{"location":"applications/calc/#path","title":"Path","text":"

    \"/usr/lib/libreoffice/program/soffice\"

    "},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/calc/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"

    \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"

    "},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"

    \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"

    "},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ods;ots;csv\"

    "},{"location":"applications/calc/#acl","title":"ACL","text":"

    {\"permit\":[\"all\"]}

    "},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"

    libreoffice.libreoffice-calc

    "},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"

    /usr/share/applications/libreoffice-calc.desktop

    "},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"
    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_calc.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-calc\",\n    \"name\": \"calc\",\n    \"displayname\": \"Calc\",\n    \"showinview\": \"dock\",\n    \"args\": \"--calc\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n    \"legacyfileextensions\": \"ods;ots;csv\",\n    \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/calculator/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"
    gnome-calculator\n
    "},{"location":"applications/calculator/#path","title":"Path","text":"
    /usr/bin/gnome-calculator\n
    "},{"location":"applications/calculator/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"
    gnome-calculator.gnome-calculator\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/calculator/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Calculator.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"

    json source file calculator.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-calculator\",\n    \"icon\": \"gnome_calculator.svg\",\n    \"keyword\": \"calculator\",\n    \"launch\": \"gnome-calculator.gnome-calculator\",\n    \"name\": \"calculator\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-calculator\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
    "},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
    "},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application calculator

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
    "},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
    "},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
    "},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/chess/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"
    gnuchess gnome-chess\n
    "},{"location":"applications/chess/#path","title":"Path","text":"
    /usr/bin/gnome-chess\n
    "},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"
    application/x-chess-pgn\n
    "},{"location":"applications/chess/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"
    gnome-chess.gnome-chess\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chess/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Chess.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"

    json source file chess.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnuchess gnome-chess\",\n    \"icon\": \"circle_chess.svg\",\n    \"keyword\": \"chess gnuchess\",\n    \"launch\": \"gnome-chess.gnome-chess\",\n    \"name\": \"chess\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-chess\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-chess-pgn\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
    "},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
    "},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chess

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
    "},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
    "},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
    "},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/chrome/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"
    krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
    "},{"location":"applications/chrome/#displayname","title":"Displayname","text":"
    Chrome\n
    "},{"location":"applications/chrome/#path","title":"Path","text":"
    /usr/bin/google-chrome-stable\n
    "},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
    "},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/chrome/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/chrome/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"
    google-chrome.Google-chrome\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chrome/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/google-chrome.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
    "},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"

    json source file chrome.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n    ],\n    \"icon\": \"circle_google-chrome.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"google-chrome.Google-chrome\",\n    \"name\": \"chrome\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Chrome\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/google-chrome-stable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
    "},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chrome

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
    "},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
    "},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
    "},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/chromium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"
    chromium\n
    "},{"location":"applications/chromium/#displayname","title":"Displayname","text":"
    chromium (alpine)\n
    "},{"location":"applications/chromium/#path","title":"Path","text":"
    /usr/bin/chromium-browser\n
    "},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
    "},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/chromium/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/chromium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"
    chromium.Chromium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chromium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/chromium-browser.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"

    json source file chromium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"chromium\",\n    \"icon\": \"circle_chromium.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"chromium.Chromium\",\n    \"name\": \"chromium\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"chromium (alpine)\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/chromium-browser\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
    "},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chromium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
    "},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
    "},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
    "},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/citrix/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"
    libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
    "},{"location":"applications/citrix/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/citrix/#arguments","title":"Arguments","text":"

    \"-icaroot /opt/Citrix/ICAClient\"

    "},{"location":"applications/citrix/#displayname","title":"Displayname","text":"
    citrix-client\n
    "},{"location":"applications/citrix/#path","title":"Path","text":"
    /opt/Citrix/ICAClient/wfica\n
    "},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"
    application/x-ica;\n
    "},{"location":"applications/citrix/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"
    Wfica.Wfica\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/citrix/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/wfica.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"

    json source file citrix.d.3.0.json

    {\n    \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"postruncommands\": [\n        \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n    \"icon\": \"icaclient.svg\",\n    \"keyword\": \"ica,icaclient,\",\n    \"launch\": \"Wfica.Wfica\",\n    \"name\": \"citrix\",\n    \"displayname\": \"citrix-client\",\n    \"secrets_requirement\": \"citrix\",\n    \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n    \"path\": \"/opt/Citrix/ICAClient/wfica\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"mimetype\": \"application/x-ica;\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"512M\",\n        \"pid_mode\": true,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"usedefaultapplication\": true,\n    \"licence\": \"non-free\"\n}\n
    "},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
    "},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application citrix

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
    "},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
    "},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
    "},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"
    cf8-cli\n
    "},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"

    \"--disable-factory --class pivotalio.cf\"

    "},{"location":"applications/cloudfoundry/#displayname","title":"Displayname","text":"
    Cloud Foundry cli\n
    "},{"location":"applications/cloudfoundry/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.pivotalio.cf\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cloudfoundry/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
    "},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"

    json source file cloudfoundry.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n        \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n    ],\n    \"debpackage\": \"cf8-cli\",\n    \"icon\": \"pivotalio-icon.svg\",\n    \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n    \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n    \"name\": \"cloudFoundry\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"Cloud Foundry cli\",\n    \"args\": \"--disable-factory --class pivotalio.cf\",\n    \"quick\": true\n}\n
    "},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
    "},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cloudFoundry

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
    "},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
    "},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
    "},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"
    cmd.exe wine (alpine)\n
    "},{"location":"applications/cmd.exe/#path","title":"Path","text":"
    /usr/bin/wineconsole\n
    "},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"
    conhost.exe.conhost.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cmd.exe/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"

    json source file cmd.exe.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"cmd.svg\",\n    \"keyword\": \"wine,command,cmd.exe\",\n    \"launch\": \"conhost.exe.conhost.exe\",\n    \"name\": \"cmd.exe\",\n    \"displayname\": \"cmd.exe wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/wineconsole\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
    "},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cmd.exe

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
    "},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
    "},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
    "},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"
    ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
    "},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"

    \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"

    "},{"location":"applications/cntlm/#displayname","title":"Displayname","text":"
    cntlm\n
    "},{"location":"applications/cntlm/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cntlm/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cntlm\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cntlm/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
    "},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
    "},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n    \"icon\": \"cntlm.svg\",\n    \"keyword\": \"cntlm,proxy,ntlm\",\n    \"launch\": \"gnome-terminal-server.cntlm\",\n    \"name\": \"cntlm\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"displayname\": \"cntlm\",\n    \"host_config\": {\n        \"network_mode\": \"container\"\n    },\n    \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n    \"preruncommands\": [\n        \"COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\",\n        \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n    ],\n    \"postruncommands\": [\n        \"RUN chown balloon:root /etc/cntlm.conf\",\n        \"RUN chmod 755 /composer/cntlm.mustache\"\n    ]\n}\n
    "},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
    "},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cntlm

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
    "},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
    "},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
    "},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"
    libgl1 corsix-th\n
    "},{"location":"applications/corsix-th/#path","title":"Path","text":"
    /usr/games/corsix-th\n
    "},{"location":"applications/corsix-th/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"
    corsix-th.corsix-th\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/corsix-th/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/com.corsixth.CorsixTH.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
    "},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"

    json source file corsix-th.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n        \"RUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n        \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n    ],\n    \"debpackage\": \"libgl1 corsix-th\",\n    \"icon\": \"games.svg\",\n    \"keyword\": \"hospital,role,playing\",\n    \"launch\": \"corsix-th.corsix-th\",\n    \"name\": \"corsix-th\",\n    \"path\": \"/usr/games/corsix-th\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
    "},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
    "},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application corsix-th

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
    "},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
    "},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
    "},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cuda/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git\n
    "},{"location":"applications/cuda/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cuda\"

    "},{"location":"applications/cuda/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cuda/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cuda\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cuda/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"

    json source file cuda.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cuda\",\n    \"name\": \"cuda\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cuda\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
    "},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cuda

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
    "},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
    "},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
    "},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
    "},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"

    "},{"location":"applications/cudademo/#displayname","title":"Displayname","text":"
    cuda demo\n
    "},{"location":"applications/cudademo/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cudademo/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cudademo\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cudademo/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"

    json source file cudademo.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cudademo\",\n    \"name\": \"cudademo\",\n    \"displayname\": \"cuda demo\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
    "},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cudademo

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
    "},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
    "},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
    "},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
    "},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cudadev\"

    "},{"location":"applications/cudadev/#displayname","title":"Displayname","text":"
    cuda developper\n
    "},{"location":"applications/cudadev/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cudadev/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cudadev\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cudadev/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
    "},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"

    json source file cudadev.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia dev\",\n    \"launch\": \"gnome-terminal-server.cudadev\",\n    \"name\": \"cudadev\",\n    \"displayname\": \"cuda developper\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudadev\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n        \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n        \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n    ]\n}\n
    "},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
    "},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cudadev

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
    "},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
    "},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
    "},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/dia/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"
    dia dia-lang\n
    "},{"location":"applications/dia/#path","title":"Path","text":"
    /usr/bin/dia\n
    "},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"
    application/x-dia-diagram;\n
    "},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"

    \"dia\"

    "},{"location":"applications/dia/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dia\"

    "},{"location":"applications/dia/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"
    dia-gnome.Dia-gnome\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/dia/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/dia.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"

    json source file dia.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"dia dia-lang\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_dia.svg\",\n    \"launch\": \"dia-gnome.Dia-gnome\",\n    \"name\": \"Dia\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/dia\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-dia-diagram;\",\n    \"fileextensions\": \"dia\",\n    \"legacyfileextensions\": \"dia\",\n    \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
    "},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
    "},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Dia

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
    "},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
    "},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
    "},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/doom/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"
    chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
    "},{"location":"applications/doom/#displayname","title":"Displayname","text":"
    Doom\n
    "},{"location":"applications/doom/#path","title":"Path","text":"
    /usr/games/doom\n
    "},{"location":"applications/doom/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"
    chocolate-doom.chocolate-doom\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/doom/#json-dump","title":"JSON dump","text":"

    json source file doom.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n    \"icon\": \"doom.svg\",\n    \"keyword\": \"doom\",\n    \"launch\": \"chocolate-doom.chocolate-doom\",\n    \"name\": \"doom\",\n    \"displayname\": \"Doom\",\n    \"path\": \"/usr/games/doom\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
    "},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application doom

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
    "},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
    "},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
    "},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/draw/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/draw/#arguments","title":"Arguments","text":"

    \"--draw\"

    "},{"location":"applications/draw/#displayname","title":"Displayname","text":"
    Draw\n
    "},{"location":"applications/draw/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/draw/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
    "},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"

    \"odp;otg\"

    "},{"location":"applications/draw/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odp;otg\"

    "},{"location":"applications/draw/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-draw\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/draw/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-draw.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"

    json source file draw.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_draw.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-draw\",\n    \"name\": \"draw\",\n    \"displayname\": \"Draw\",\n    \"showinview\": \"dock\",\n    \"args\": \"--draw\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n    \"fileextensions\": \"odp;otg\",\n    \"legacyfileextensions\": \"odp;otg\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
    "},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application draw

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
    "},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
    "},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
    "},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/drawio/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"
    libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
    "},{"location":"applications/drawio/#displayname","title":"Displayname","text":"
    draw.io\n
    "},{"location":"applications/drawio/#path","title":"Path","text":"
    /opt/drawio/drawio\n
    "},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"
    application/vnd.jgraph.mxfile;application/vnd.visio;\n
    "},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"

    \"drawio\"

    "},{"location":"applications/drawio/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"drawio\"

    "},{"location":"applications/drawio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"
    draw.io.draw.io\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/drawio/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/drawio.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"

    json source file drawio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n    \"icon\": \"circle_drawio.svg\",\n    \"launch\": \"draw.io.draw.io\",\n    \"name\": \"drawio\",\n    \"displayname\": \"draw.io\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/drawio/drawio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n    \"fileextensions\": \"drawio\",\n    \"legacyfileextensions\": \"drawio\",\n    \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n    \"postruncommands\": [\n        \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
    "},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
    "},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application drawio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
    "},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
    "},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
    "},{"location":"applications/dummy/","title":"Dummy","text":"

    dummy

    "},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.eclipse

    "},{"location":"applications/eclipse/#display-name","title":"Display name","text":"

    \"Eclipse\"

    "},{"location":"applications/eclipse/#path","title":"path","text":"

    \"/usr/bin/eclipse\"

    "},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.sts4

    "},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"

    \"Eclipse Sts4\"

    "},{"location":"applications/eclipse_sts4/#path","title":"path","text":"

    \"/opt/sts/SpringToolSuite4\"

    "},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/edge/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"
    microsoft-edge-stable\n
    "},{"location":"applications/edge/#displayname","title":"Displayname","text":"
    Microsoft Edge\n
    "},{"location":"applications/edge/#path","title":"Path","text":"
    /usr/bin/microsoft-edge-stable\n
    "},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"
    application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
    "},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/edge/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/edge/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"
    microsoft-edge.Microsoft-edge\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/edge/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/microsoft-edge.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
    "},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"

    json source file edge.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"microsoft-edge-stable\",\n    \"preruncommands\": [\n        \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n    ],\n    \"icon\": \"circle_microsoft-edge.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"microsoft-edge.Microsoft-edge\",\n    \"name\": \"edge\",\n    \"displayname\": \"Microsoft Edge\",\n    \"path\": \"/usr/bin/microsoft-edge-stable\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
    "},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application edge

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
    "},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
    "},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
    "},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.elementary

    "},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
    io.elementary.terminal io.elementary.stylesheet\n
    "},{"location":"applications/elementary.terminal/#path","title":"Path","text":"
    /usr/bin/io.elementary.terminal\n
    "},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"
    io.elementary.terminal.Io.elementary.terminal\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/elementary.terminal/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/io.elementary.terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd\",\n    \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n    \"name\": \"elementary.terminal\",\n    \"path\": \"/usr/bin/io.elementary.terminal\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n    \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
    "},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application elementary.terminal

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
    "},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
    "},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
    "},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/eog/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"
    eog\n
    "},{"location":"applications/eog/#path","title":"Path","text":"
    /usr/bin/eog\n
    "},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"
    image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
    "},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"

    \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

    "},{"location":"applications/eog/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

    "},{"location":"applications/eog/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"
    eog.Eog\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/eog/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.eog.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"

    json source file eog.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"eog\",\n    \"icon\": \"circle_eog.svg\",\n    \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"eog.Eog\",\n    \"name\": \"eog\",\n    \"path\": \"/usr/bin/eog\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n    \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
    "},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
    "},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application eog

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
    "},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
    "},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
    "},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/evince/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"
    evince\n
    "},{"location":"applications/evince/#path","title":"Path","text":"
    /usr/bin/evince\n
    "},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"
    application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
    "},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"

    \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"

    "},{"location":"applications/evince/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"pdf;ps;dvi\"

    "},{"location":"applications/evince/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"
    evince.Evince\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/evince/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Evince.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"

    json source file evince.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"evince\",\n    \"icon\": \"circle_acroread.svg\",\n    \"keyword\": \"evince,pdf,viewer\",\n    \"launch\": \"evince.Evince\",\n    \"name\": \"Evince\",\n    \"path\": \"/usr/bin/evince\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n    \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n    \"legacyfileextensions\": \"pdf;ps;dvi\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
    "},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Evince

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
    "},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
    "},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
    "},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/evolution/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"
    evolution dbus-x11\n
    "},{"location":"applications/evolution/#displayname","title":"Displayname","text":"
    Evolution\n
    "},{"location":"applications/evolution/#path","title":"Path","text":"
    /usr/bin/evolution\n
    "},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"
    text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
    "},{"location":"applications/evolution/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"
    evolution.Evolution\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/evolution/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Evolution.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"

    json source file evolution.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"evolution dbus-x11\",\n    \"icon\": \"evolution.svg\",\n    \"keyword\": \"evolution,mail\",\n    \"launch\": \"evolution.Evolution\",\n    \"name\": \"evolution\",\n    \"displayname\": \"Evolution\",\n    \"path\": \"/usr/bin/evolution\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
    "},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
    "},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application evolution

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
    "},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
    "},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
    "},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"
    file-roller\n
    "},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"
    file-roller\n
    "},{"location":"applications/file-roller/#path","title":"Path","text":"
    /usr/bin/file-roller\n
    "},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"
    application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
    "},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"

    \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"

    "},{"location":"applications/file-roller/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"
    file-roller.File-roller\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/file-roller/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.FileRoller.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"

    json source file file-roller.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"file-roller\",\n    \"icon\": \"circle_file-roller.svg\",\n    \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n    \"launch\": \"file-roller.File-roller\",\n    \"name\": \"file-roller\",\n    \"displayname\": \"file-roller\",\n    \"path\": \"/usr/bin/file-roller\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n    \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
    "},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application file-roller

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
    "},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
    "},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
    "},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/filelight/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"
    filelight\n
    "},{"location":"applications/filelight/#displayname","title":"Displayname","text":"
    Filelight\n
    "},{"location":"applications/filelight/#path","title":"Path","text":"
    /usr/bin/filelight\n
    "},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"
    inode/directory;\n
    "},{"location":"applications/filelight/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"
    filelight.filelight\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/filelight/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.filelight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"

    json source file filelight.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"filelight\",\n    \"icon\": \"filelight.svg\",\n    \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n    \"launch\": \"filelight.filelight\",\n    \"name\": \"filelight\",\n    \"displayname\": \"Filelight\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/filelight\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"inode/directory;\",\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
    "},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
    "},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application filelight

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
    "},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
    "},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
    "},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"
    filezilla\n
    "},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"
    filezilla (alpine)\n
    "},{"location":"applications/filezilla/#path","title":"Path","text":"
    /usr/bin/filezilla\n
    "},{"location":"applications/filezilla/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"
    filezilla.Filezilla\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/filezilla/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/filezilla.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"

    json source file filezilla.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"filezilla\",\n    \"icon\": \"circle_filezilla.svg\",\n    \"keyword\": \"ftp,client\",\n    \"launch\": \"filezilla.Filezilla\",\n    \"name\": \"filezilla\",\n    \"displayname\": \"filezilla (alpine)\",\n    \"path\": \"/usr/bin/filezilla\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
    "},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
    "},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application filezilla

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
    "},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
    "},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
    "},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"
    firefox-esr\n
    "},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"
    Firefox (esr alpine)\n
    "},{"location":"applications/firefox-esr/#path","title":"Path","text":"
    /usr/bin/firefox-esr\n
    "},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"

    \"htm;html;xml;gif\"

    "},{"location":"applications/firefox-esr/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"htm;html;xml\"

    "},{"location":"applications/firefox-esr/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"
    Navigator.firefox-esr\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/firefox-esr/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox-esr.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
    "},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"

    json source file firefox-esr.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox-esr\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox-esr\",\n    \"name\": \"firefox-esr\",\n    \"displayname\": \"Firefox (esr alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox-esr\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
    "},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application firefox-esr

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
    "},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
    "},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
    "},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/firefox/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"
    firefox krb5\n
    "},{"location":"applications/firefox/#displayname","title":"Displayname","text":"
    Firefox (alpine)\n
    "},{"location":"applications/firefox/#path","title":"Path","text":"
    /usr/bin/firefox\n
    "},{"location":"applications/firefox/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"

    \"htm;html;xml;gif\"

    "},{"location":"applications/firefox/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"htm;html;xml\"

    "},{"location":"applications/firefox/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"
    Navigator.firefox\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/firefox/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
    "},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"

    json source file firefox.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"postruncommands\": [\n        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox krb5\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox\",\n    \"args\": \"\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox (alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
    "},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Firefox

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
    "},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
    "},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
    "},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.firefox.rest

    "},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"

    firefox winbind

    "},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"

    \"--class=Rest.Firefox\"

    "},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"

    \"Firefox-Rest\"

    "},{"location":"applications/firefoxrest/#path","title":"path","text":"

    \"/usr/bin/firefox\"

    "},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"

    \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"

    "},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"
    \nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
    "},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/flare/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"
    flare-game\n
    "},{"location":"applications/flare/#arguments","title":"Arguments","text":"

    \"--game=flare-game\"

    "},{"location":"applications/flare/#path","title":"Path","text":"
    /usr/games/flare\n
    "},{"location":"applications/flare/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"
    flare.flare\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/flare/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/flare.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"

    json source file flare.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"flare-game\",\n    \"icon\": \"flare.svg\",\n    \"keyword\": \"flare-game,role,playing\",\n    \"launch\": \"flare.flare\",\n    \"name\": \"flare\",\n    \"args\": \"--game=flare-game\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/flare\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
    "},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
    "},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application flare

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
    "},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
    "},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
    "},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"
    frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"
    frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#path","title":"Path","text":"
    /usr/games/frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"
    perl.perl\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/frozen-bubble/#json-dump","title":"JSON dump","text":"

    json source file frozen-bubble.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"frozen-bubble\",\n    \"icon\": \"frozen-bubble.svg\",\n    \"keyword\": \"frozen,bubble\",\n    \"launch\": \"perl.perl\",\n    \"name\": \"frozen-bubble\",\n    \"displayname\": \"frozen-bubble\",\n    \"path\": \"/usr/games/frozen-bubble\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
    "},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application frozen-bubble

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
    "},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
    "},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
    "},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"
    qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
    "},{"location":"applications/gcompris/#path","title":"Path","text":"
    /usr/games/gcompris-qt\n
    "},{"location":"applications/gcompris/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"
    gcompris-qt.gcompris-qt\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gcompris/#json-dump","title":"JSON dump","text":"

    json source file gcompris.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n    \"icon\": \"gcompris.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"gcompris\",\n    \"launch\": \"gcompris-qt.gcompris-qt\",\n    \"name\": \"GCompris\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/games/gcompris-qt\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
    "},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
    "},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application GCompris

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
    "},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
    "},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
    "},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/geany/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"
    geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
    "},{"location":"applications/geany/#displayname","title":"Displayname","text":"
    Geany\n
    "},{"location":"applications/geany/#path","title":"Path","text":"
    /usr/bin/geany\n
    "},{"location":"applications/geany/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"
    text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
    "},{"location":"applications/geany/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"
    geany.Geany\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/geany/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/geany.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"

    json source file geany.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"geany.svg\",\n    \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n    \"keyword\": \"text,editor,geany,ide\",\n    \"launch\": \"geany.Geany\",\n    \"name\": \"geany\",\n    \"displayname\": \"Geany\",\n    \"path\": \"/usr/bin/geany\",\n    \"showinview\": \"dock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n    \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
    "},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
    "},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application geany

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
    "},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
    "},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
    "},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/gedit/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"
    gedit\n
    "},{"location":"applications/gedit/#path","title":"Path","text":"
    /usr/bin/gedit\n
    "},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"
    text/plain;\n
    "},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"

    \"txt\"

    "},{"location":"applications/gedit/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"txt\"

    "},{"location":"applications/gedit/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"
    gedit.Gedit\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gedit/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gedit.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"

    json source file gedit.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gedit\",\n    \"icon\": \"gedit.svg\",\n    \"keyword\": \"editor\",\n    \"launch\": \"gedit.Gedit\",\n    \"name\": \"Gedit\",\n    \"path\": \"/usr/bin/gedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"text/plain;\",\n    \"fileextensions\": \"txt\",\n    \"legacyfileextensions\": \"txt\",\n    \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
    "},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gedit

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
    "},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
    "},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
    "},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"
    gelemental\n
    "},{"location":"applications/gelemental/#path","title":"Path","text":"
    /usr/bin/gelemental\n
    "},{"location":"applications/gelemental/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"
    gelemental.Gelemental\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gelemental/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gelemental.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"

    json source file gelemental.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gelemental\",\n    \"icon\": \"gelemental.svg\",\n    \"keyword\": \"gelemental\",\n    \"launch\": \"gelemental.Gelemental\",\n    \"name\": \"gElemental\",\n    \"path\": \"/usr/bin/gelemental\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
    "},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
    "},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application gElemental

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
    "},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
    "},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
    "},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"
    geogebra\n
    "},{"location":"applications/geogebra/#path","title":"Path","text":"
    /usr/bin/geogebra\n
    "},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"

    \"ggb;ggt\"

    "},{"location":"applications/geogebra/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ggb;ggt\"

    "},{"location":"applications/geogebra/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"
    geogebra-GeoGebra.geogebra-GeoGebra\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/geogebra/#json-dump","title":"JSON dump","text":"

    json source file geogebra.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"geogebra\",\n    \"icon\": \"geogebra.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"geogebra,math\",\n    \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n    \"name\": \"Geogebra\",\n    \"path\": \"/usr/bin/geogebra\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"fileextensions\": \"ggb;ggt\",\n    \"legacyfileextensions\": \"ggb;ggt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktop\": \"geogebra.desktop\"\n}\n
    "},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
    "},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Geogebra

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
    "},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
    "},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
    "},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.gephi

    "},{"location":"applications/gephi/#display-name","title":"Display name","text":"

    \"Gephi\"

    "},{"location":"applications/gephi/#path","title":"path","text":"

    \"/opt/gephi-0.9.1/bin/gephi\"

    "},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.gimagereader

    "},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"

    \"OCR-gimagereader\"

    "},{"location":"applications/gimagereader/#path","title":"path","text":"

    \"/usr/bin/gimagereader-gtk\"

    "},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"

    \"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"

    "},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"

    \"bmp;jpeg;png,tiff,tga\"

    "},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/gimp/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"
    gimp gimp-lang\n
    "},{"location":"applications/gimp/#path","title":"Path","text":"
    /usr/bin/gimp\n
    "},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"
    image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
    "},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"

    \"dds\"

    "},{"location":"applications/gimp/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dds\"

    "},{"location":"applications/gimp/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"
    gimp.Gimp\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gimp/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gimp.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"

    json source file gimp.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"gimp gimp-lang\",\n    \"icon\": \"circle_gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\": \"dds\",\n    \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n    \"usedefaultapplication\": false,\n    \"quick\": true\n}\n
    "},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
    "},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gimp

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
    "},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
    "},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
    "},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"
    gnumeric glpk\n
    "},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"
    Gnumerix (alpine)\n
    "},{"location":"applications/gnumeric/#path","title":"Path","text":"
    /usr/bin/gnumeric\n
    "},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"
    application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
    "},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"

    \"gnm\"

    "},{"location":"applications/gnumeric/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"gnm\"

    "},{"location":"applications/gnumeric/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"
    gnumeric.Gnumeric\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gnumeric/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnumeric.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"

    json source file gnumeric.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnumeric glpk\",\n    \"icon\": \"gnumeric.svg\",\n    \"keyword\": \"numeric\",\n    \"launch\": \"gnumeric.Gnumeric\",\n    \"displayname\": \"Gnumerix (alpine)\",\n    \"name\": \"Gnumeric\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnumeric\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n    \"fileextensions\": \"gnm\",\n    \"legacyfileextensions\": \"gnm\",\n    \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
    "},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gnumeric

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
    "},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
    "},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
    "},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/golly/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"
    golly\n
    "},{"location":"applications/golly/#path","title":"Path","text":"
    /usr/games/golly\n
    "},{"location":"applications/golly/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"
    golly.Golly\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/golly/#json-dump","title":"JSON dump","text":"

    json source file golly.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"golly\",\n    \"icon\": \"golly.svg\",\n    \"keyword\": \"golly\",\n    \"launch\": \"golly.Golly\",\n    \"name\": \"Golly\",\n    \"path\": \"/usr/games/golly\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
    "},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
    "},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Golly

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
    "},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
    "},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
    "},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/gretl/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"
    gretl\n
    "},{"location":"applications/gretl/#path","title":"Path","text":"
    /usr/bin/gretl\n
    "},{"location":"applications/gretl/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"
    gretl_x11.Gretl_x11\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gretl/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gretl\",\n    \"icon\": \"gretl.svg\",\n    \"keyword\": \"gretl\",\n    \"launch\": \"gretl_x11.Gretl_x11\",\n    \"name\": \"Gretl\",\n    \"path\": \"/usr/bin/gretl\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
    "},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gretl

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
    "},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
    "},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
    "},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/hyper/#path","title":"Path","text":"
    /opt/Hyper/hyper\n
    "},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/ssh\n
    "},{"location":"applications/hyper/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"
    hyper.Hyper\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/hyper/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/hyper.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
    "},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"

    json source file hyper.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n    ],\n    \"icon\": \"hyper.svg\",\n    \"keyword\": \"terminal,remote\",\n    \"launch\": \"hyper.Hyper\",\n    \"name\": \"hyper\",\n    \"path\": \"/opt/Hyper/hyper\",\n    \"mimetype\": \"x-scheme-handler/ssh\",\n    \"fileextensions\": \"\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
    "},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
    "},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application hyper

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
    "},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
    "},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
    "},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/impress/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/impress/#arguments","title":"Arguments","text":"

    \"--impress\"

    "},{"location":"applications/impress/#displayname","title":"Displayname","text":"
    Impress\n
    "},{"location":"applications/impress/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/impress/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
    "},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"

    \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"

    "},{"location":"applications/impress/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odp\"

    "},{"location":"applications/impress/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-impress\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/impress/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-impress.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"

    json source file impress.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_impress.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-impress\",\n    \"name\": \"impress\",\n    \"displayname\": \"Impress\",\n    \"showinview\": \"dock\",\n    \"args\": \"--impress\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n    \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n    \"legacyfileextensions\": \"odp\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
    "},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application impress

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
    "},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
    "},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
    "},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"
    inkscape inkscape-lang\n
    "},{"location":"applications/inkscape/#path","title":"Path","text":"
    /usr/bin/inkscape\n
    "},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"
    image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
    "},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"

    \"ai;cdr\"

    "},{"location":"applications/inkscape/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ai;cdr\"

    "},{"location":"applications/inkscape/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"
    org.inkscape.Inkscape.Inkscape\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/inkscape/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.inkscape.Inkscape.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"

    json source file inkscape.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"inkscape inkscape-lang\",\n    \"icon\": \"circle_inkscape.svg\",\n    \"keyword\": \"inkscape\",\n    \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n    \"name\": \"inkscape\",\n    \"path\": \"/usr/bin/inkscape\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n    \"fileextensions\": \"ai;cdr\",\n    \"legacyfileextensions\": \"ai;cdr\",\n    \"installrecommends\": true,\n    \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
    "},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
    "},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application inkscape

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
    "},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
    "},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
    "},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"

    "},{"location":"applications/jupyter/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/jupyter/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.jupyter\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/jupyter/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
    "},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
    "},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"

    json source file jupyter.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyter\",\n    \"name\": \"jupyter\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
    "},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
    "},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application jupyter

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
    "},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
    "},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
    "},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"

    "},{"location":"applications/jupyternvidia/#displayname","title":"Displayname","text":"
    jupyter nvidia\n
    "},{"location":"applications/jupyternvidia/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.jupyternvidia\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/jupyternvidia/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
    "},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
    "},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"

    json source file jupyternvidia.d.3.0.json

    {\n    \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n        \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n        \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n        \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n        \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n        \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install tensorflow-gpu\",\n        \"RUN pip3 install jupyter notebook\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip3 install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyternvidia\",\n    \"name\": \"jupyternvidia\",\n    \"displayname\": \"jupyter nvidia\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
    "},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
    "},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application jupyternvidia

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
    "},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
    "},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
    "},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"
    kalzium\n
    "},{"location":"applications/kalzium/#path","title":"Path","text":"
    /usr/bin/kalzium\n
    "},{"location":"applications/kalzium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"
    kalzium.kalzium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kalzium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kalzium.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"

    json source file kalzium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kalzium\",\n    \"icon\": \"kalzium.svg\",\n    \"keyword\": \"kalzium\",\n    \"launch\": \"kalzium.kalzium\",\n    \"name\": \"Kalzium\",\n    \"path\": \"/usr/bin/kalzium\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
    "},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Kalzium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
    "},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
    "},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
    "},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"
    kdiamond\n
    "},{"location":"applications/kdiamond/#path","title":"Path","text":"
    /usr/games/kdiamond\n
    "},{"location":"applications/kdiamond/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"
    kdiamond.kdiamond\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kdiamond/#json-dump","title":"JSON dump","text":"

    json source file kdiamond.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"kdiamond\",\n    \"icon\": \"kdiamond.svg\",\n    \"keyword\": \"kdiamond\",\n    \"launch\": \"kdiamond.kdiamond\",\n    \"name\": \"kDiamond\",\n    \"path\": \"/usr/games/kdiamond\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
    "},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kDiamond

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
    "},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
    "},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
    "},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"
    kgeography\n
    "},{"location":"applications/kgeography/#path","title":"Path","text":"
    /usr/bin/kgeography\n
    "},{"location":"applications/kgeography/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"
    kgeography.kgeography\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kgeography/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kgeography.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"

    json source file kgeography.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kgeography\",\n    \"icon\": \"kgeography.svg\",\n    \"keyword\": \"kgeography,geography\",\n    \"launch\": \"kgeography.kgeography\",\n    \"name\": \"Kgeography\",\n    \"path\": \"/usr/bin/kgeography\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
    "},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Kgeography

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
    "},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
    "},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
    "},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/kigo/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11 dbus-user-session gnugo kigo\n
    "},{"location":"applications/kigo/#displayname","title":"Displayname","text":"
    kigo\n
    "},{"location":"applications/kigo/#path","title":"Path","text":"
    /usr/games/kigo\n
    "},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"
    application/x-go-sgf;\n
    "},{"location":"applications/kigo/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"
    kigo.kigo\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kigo/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kigo.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
    "},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"

    json source file kigo.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"args\": \"\",\n    \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n    \"icon\": \"kigo.svg\",\n    \"keyword\": \"go,kigo,gnugo\",\n    \"launch\": \"kigo.kigo\",\n    \"name\": \"kigo\",\n    \"mimetype\": \"application/x-go-sgf;\",\n    \"displayname\": \"kigo\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"path\": \"/usr/games/kigo\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n    ]\n}\n
    "},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
    "},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kigo

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
    "},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
    "},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
    "},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/klickety/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"
    breeze-icon-theme dbus-x11 dbus-user-session klickety\n
    "},{"location":"applications/klickety/#path","title":"Path","text":"
    /usr/games/klickety\n
    "},{"location":"applications/klickety/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"
    klickety.klickety\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/klickety/#json-dump","title":"JSON dump","text":"

    json source file klickety.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n    \"icon\": \"klickety.svg\",\n    \"keyword\": \"klickety\",\n    \"launch\": \"klickety.klickety\",\n    \"name\": \"Klickety\",\n    \"path\": \"/usr/games/klickety\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
    "},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Klickety

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
    "},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
    "},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
    "},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/klotski/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-klotski\n
    "},{"location":"applications/klotski/#path","title":"Path","text":"
    /usr/games/gnome-klotski\n
    "},{"location":"applications/klotski/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"
    gnome-klotski.Gnome-klotski\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/klotski/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-klotski.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"

    json source file klotski.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-klotski\",\n    \"icon\": \"circle_gnome-klotski.svg\",\n    \"keyword\": \"gnome klotski,game klotski,klotski\",\n    \"launch\": \"gnome-klotski.Gnome-klotski\",\n    \"name\": \"klotski\",\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/gnome-klotski\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
    "},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
    "},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application klotski

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
    "},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
    "},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
    "},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/konsole/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"
    konsole, sudo\n
    "},{"location":"applications/konsole/#path","title":"Path","text":"
    /usr/bin/konsole\n
    "},{"location":"applications/konsole/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"
    konsole.konsole\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/konsole/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"

    json source file konsole.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"icon\": \"konsole.svg\",\n    \"apkpackage\": \"konsole, sudo\",\n    \"keyword\": \"ksonsole,console,shell,bash,sh\",\n    \"launch\": \"konsole.konsole\",\n    \"name\": \"konsole\",\n    \"path\": \"/usr/bin/konsole\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
    "},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
    "},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application konsole

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
    "},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
    "},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
    "},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu

    "},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11 dbus-user-session ksquares\n
    "},{"location":"applications/ksquares/#path","title":"Path","text":"
    /usr/games/ksquares\n
    "},{"location":"applications/ksquares/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"
    ksquares.ksquares\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/ksquares/#json-dump","title":"JSON dump","text":"

    json source file ksquares.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n    \"icon\": \"ksquares.svg\",\n    \"keyword\": \"ksquares\",\n    \"launch\": \"ksquares.ksquares\",\n    \"name\": \"kSquares\",\n    \"path\": \"/usr/games/ksquares\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
    "},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
    "},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kSquares

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
    "},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
    "},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
    "},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"
    kturtle mesa-dri-gallium\n
    "},{"location":"applications/kturtle/#path","title":"Path","text":"
    /usr/bin/kturtle\n
    "},{"location":"applications/kturtle/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"
    kturtle.kturtle\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kturtle/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kturtle.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"

    json source file kturtle.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kturtle mesa-dri-gallium\",\n    \"icon\": \"kturtle.svg\",\n    \"keyword\": \"kturtle\",\n    \"launch\": \"kturtle.kturtle\",\n    \"name\": \"kTurtle\",\n    \"path\": \"/usr/bin/kturtle\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
    "},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
    "},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kTurtle

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
    "},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
    "},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
    "},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/leocad/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"
    leocad\n
    "},{"location":"applications/leocad/#arguments","title":"Arguments","text":"

    \"-l /usr/bin/leocad.library.bin\"

    "},{"location":"applications/leocad/#path","title":"Path","text":"
    /usr/bin/leocad\n
    "},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"
    application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
    "},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"

    \"lcd\"

    "},{"location":"applications/leocad/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"lcd\"

    "},{"location":"applications/leocad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"
    leocad.Leocad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/leocad/#json-dump","title":"JSON dump","text":"

    json source file leocad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"-l /usr/bin/leocad.library.bin\",\n    \"cat\": \"games\",\n    \"debpackage\": \"leocad\",\n    \"icon\": \"leocad.svg\",\n    \"keyword\": \"cad,lego\",\n    \"launch\": \"leocad.Leocad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"Leocad\",\n    \"path\": \"/usr/bin/leocad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n    \"fileextensions\": \"lcd\",\n    \"legacyfileextensions\": \"lcd\"\n}\n
    "},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
    "},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Leocad

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
    "},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
    "},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
    "},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/librecad/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"
    librecad\n
    "},{"location":"applications/librecad/#path","title":"Path","text":"
    /usr/bin/librecad\n
    "},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"
    image/vnd.dxf;\n
    "},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"

    \"dxf;dwg\"

    "},{"location":"applications/librecad/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dxf;dwg\"

    "},{"location":"applications/librecad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"
    librecad.Librecad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/librecad/#json-dump","title":"JSON dump","text":"

    json source file librecad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"librecad\",\n    \"icon\": \"librecad.svg\",\n    \"keyword\": \"librecad,modeling\",\n    \"launch\": \"librecad.Librecad\",\n    \"name\": \"LibreCAD\",\n    \"path\": \"/usr/bin/librecad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"image/vnd.dxf;\",\n    \"fileextensions\": \"dxf;dwg\",\n    \"legacyfileextensions\": \"dxf;dwg\"\n}\n
    "},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
    "},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application LibreCAD

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
    "},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
    "},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
    "},{"location":"applications/list/","title":"Application list","text":"

    This array describe the application list ready to use with abcdesktop.

    icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-mahjongg\n
    "},{"location":"applications/mahjongg/#path","title":"Path","text":"
    /usr/games/gnome-mahjongg\n
    "},{"location":"applications/mahjongg/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"
    gnome-mahjongg.Gnome-mahjongg\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mahjongg/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-mahjongg.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"

    json source file mahjongg.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-mahjongg\",\n    \"icon\": \"circle_gnome-mahjongg.svg\",\n    \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n    \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n    \"name\": \"mahjongg\",\n    \"path\": \"/usr/games/gnome-mahjongg\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
    "},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
    "},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application mahjongg

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
    "},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
    "},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
    "},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/maps/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"
    gnome-maps\n
    "},{"location":"applications/maps/#path","title":"Path","text":"
    /usr/bin/gnome-maps\n
    "},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"
    application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
    "},{"location":"applications/maps/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Maps.org.gnome.Maps\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/maps/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Maps.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"

    json source file maps.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-maps\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"icon\": \"org.gnome.Maps.svg\",\n    \"keyword\": \"maps\",\n    \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n    \"name\": \"maps\",\n    \"path\": \"/usr/bin/gnome-maps\",\n    \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
    "},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
    "},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application maps

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
    "},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
    "},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
    "},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/math/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/math/#arguments","title":"Arguments","text":"

    \"--math\"

    "},{"location":"applications/math/#displayname","title":"Displayname","text":"
    Math\n
    "},{"location":"applications/math/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/math/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
    "},{"location":"applications/math/#file-extensions","title":"File extensions","text":"

    \"odf;odc\"

    "},{"location":"applications/math/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odf;odc\"

    "},{"location":"applications/math/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-math\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/math/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-math.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/math/#json-dump","title":"JSON dump","text":"

    json source file math.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_math.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-math\",\n    \"name\": \"math\",\n    \"displayname\": \"Math\",\n    \"args\": \"--math\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n    \"fileextensions\": \"odf;odc\",\n    \"legacyfileextensions\": \"odf;odc\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
    "},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application math

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
    "},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f math.d -t math .\n
    "},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
    "},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"

    ubuntu

    "},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"
    mathwar\n
    "},{"location":"applications/mathwar/#path","title":"Path","text":"
    /usr/games/mathwar\n
    "},{"location":"applications/mathwar/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"
    mathwar.Mathwar\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mathwar/#json-dump","title":"JSON dump","text":"

    json source file mathwar.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"mathwar\",\n    \"icon\": \"mathwar.svg\",\n    \"keyword\": \"mathwar,math\",\n    \"launch\": \"mathwar.Mathwar\",\n    \"name\": \"Mathwar\",\n    \"path\": \"/usr/games/mathwar\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
    "},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Mathwar

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
    "},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
    "},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
    "},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/minecraft/#path","title":"Path","text":"
    /usr/bin/minecraft-launcher\n
    "},{"location":"applications/minecraft/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"
    minecraft-launcher.Minecraft Launcher\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/minecraft/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/minecraft-launcher.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
    "},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"

    json source file minecraft.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_minecraft.svg\",\n    \"keyword\": \"minecraft\",\n    \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n    \"name\": \"minecraft\",\n    \"path\": \"/usr/bin/minecraft-launcher\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktop\": \"minecraft-launcher.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"4G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n        \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n    ]\n}\n
    "},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
    "},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application minecraft

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
    "},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
    "},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
    "},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/mines/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"
    gnome-mines\n
    "},{"location":"applications/mines/#displayname","title":"Displayname","text":"
    gnome-mines (alpine)\n
    "},{"location":"applications/mines/#path","title":"Path","text":"
    /usr/bin/gnome-mines\n
    "},{"location":"applications/mines/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"
    gnome-mines.Gnome-mines\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mines/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Mines.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"

    json source file mines.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"displayname\": \"gnome-mines (alpine)\",\n    \"apkpackage\": \"gnome-mines\",\n    \"icon\": \"circle_gnome-mines.svg\",\n    \"keyword\": \"gnome mines,game mines,mines\",\n    \"launch\": \"gnome-mines.Gnome-mines\",\n    \"name\": \"Mines\",\n    \"path\": \"/usr/bin/gnome-mines\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
    "},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
    "},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Mines

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
    "},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
    "},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
    "},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
    "},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"
    FileManager\n
    "},{"location":"applications/nautilus/#path","title":"Path","text":"
    /usr/bin/nautilus\n
    "},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/nautilus/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Nautilus.Org.gnome.Nautilus\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/nautilus/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Nautilus.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
    "},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"

    json source file nautilus.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"preruncommands\": [\n        \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n        \"COPY composer/node /composer/node\",\n        \"RUN cd /composer/node/ocdownload && npm install\",\n        \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n        \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n        \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n    ],\n    \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n    \"icon\": \"circle_filemanager.svg\",\n    \"keyword\": \"file,manager,nautilus\",\n    \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n    \"name\": \"nautilus\",\n    \"displayname\": \"FileManager\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/nautilus\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
    "},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
    "},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application nautilus

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
    "},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
    "},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
    "},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"

    netbeans

    "},{"location":"applications/netbeans/#display-name","title":"Display name","text":"

    \"Netbeans\"

    "},{"location":"applications/netbeans/#path","title":"path","text":"

    \"/usr/bin/netbeans\"

    "},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"
    Notepad Wine (alpine)\n
    "},{"location":"applications/notepad-wine/#path","title":"Path","text":"
    /usr/bin/notepad\n
    "},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"
    application/text;\n
    "},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"

    \"txt;log;\"

    "},{"location":"applications/notepad-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"
    notepad.exe.notepad.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/notepad-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"

    json source file notepad-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"apkpackage\": \"wine\",\n    \"icon\": \"notepad.svg\",\n    \"keyword\": \"wine,notepad,text\",\n    \"launch\": \"notepad.exe.notepad.exe\",\n    \"name\": \"notepad-wine\",\n    \"displayname\": \"Notepad Wine (alpine)\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;\",\n    \"path\": \"/usr/bin/notepad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
    "},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application notepad-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
    "},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
    "},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
    "},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"
    notepadqq\n
    "},{"location":"applications/notepadqq/#path","title":"Path","text":"
    /usr/bin/notepadqq\n
    "},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"
    text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
    "},{"location":"applications/notepadqq/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"
    notepadqq-bin.Notepadqq\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/notepadqq/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/notepadqq.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"

    json source file notepadqq.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,development\",\n    \"debpackage\": \"notepadqq\",\n    \"icon\": \"notepadqq.svg\",\n    \"keyword\": \"notepad,plus,editor\",\n    \"launch\": \"notepadqq-bin.Notepadqq\",\n    \"name\": \"notepadqq\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/bin/notepadqq\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
    "},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
    "},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application notepadqq

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
    "},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
    "},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
    "},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/octave/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"
    octave\n
    "},{"location":"applications/octave/#path","title":"Path","text":"
    /usr/bin/octave\n
    "},{"location":"applications/octave/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"
    octave-gui.octave-gui\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/octave/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/www.octave.org-octave.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"

    json source file octave.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"octave\",\n    \"icon\": \"Gnu-octave-logo.svg\",\n    \"keyword\": \"octave\",\n    \"launch\": \"octave-gui.octave-gui\",\n    \"name\": \"octave\",\n    \"path\": \"/usr/bin/octave\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n    \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
    "},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
    "},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application octave

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
    "},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
    "},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
    "},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"
    onlyoffice-desktopeditors\n
    "},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"
    OnlyOffice\n
    "},{"location":"applications/onlyoffice/#path","title":"Path","text":"
    /usr/bin/desktopeditors\n
    "},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
    "},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"

    \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"

    "},{"location":"applications/onlyoffice/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"
    DesktopEditors.DesktopEditors\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/onlyoffice/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/onlyoffice-desktopeditors.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"

    json source file onlyoffice.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n        \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"onlyoffice-desktopeditors\",\n    \"icon\": \"onlyoffice-desktopeditors.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"office,onlyoffice,desktop,editor\",\n    \"launch\": \"DesktopEditors.DesktopEditors\",\n    \"name\": \"onlyoffice\",\n    \"displayname\": \"OnlyOffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/desktopeditors\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n    \"args\": \"\",\n    \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n    \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n    \"licence\": \"non-free\"\n}\n
    "},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
    "},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application onlyoffice

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
    "},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
    "},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
    "},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/openshift/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"
    rhc gnome-terminal\n
    "},{"location":"applications/openshift/#arguments","title":"Arguments","text":"

    \"--disable-factory --class openshift.cli\"

    "},{"location":"applications/openshift/#displayname","title":"Displayname","text":"
    OpenShift cli\n
    "},{"location":"applications/openshift/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/openshift/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.openshift.cli\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/openshift/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
    "},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n    ],\n    \"debpackage\": \"rhc gnome-terminal\",\n    \"icon\": \"openshift.svg\",\n    \"keyword\": \"oc,openshift\",\n    \"launch\": \"gnome-terminal-server.openshift.cli\",\n    \"name\": \"openshift\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"OpenShift cli\",\n    \"args\": \"--disable-factory --class openshift.cli\",\n    \"quick\": true\n}\n
    "},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
    "},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application openshift

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
    "},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
    "},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
    "},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/pinta/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"
    pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
    "},{"location":"applications/pinta/#displayname","title":"Displayname","text":"
    Pinta (alpine)\n
    "},{"location":"applications/pinta/#path","title":"Path","text":"
    /usr/bin/pinta\n
    "},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"
    image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
    "},{"location":"applications/pinta/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"
    Pinta.Pinta\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/pinta/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/pinta.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"

    json source file pinta.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"displayname\": \"Pinta (alpine)\",\n    \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n    \"icon\": \"pinta.svg\",\n    \"keyword\": \"pinta,paint\",\n    \"launch\": \"Pinta.Pinta\",\n    \"name\": \"Pinta\",\n    \"path\": \"/usr/bin/pinta\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n    \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
    "},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
    "},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Pinta

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
    "},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
    "},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
    "},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/planner/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"
    planner\n
    "},{"location":"applications/planner/#path","title":"Path","text":"
    /usr/bin/planner\n
    "},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"
    application/x-planner;\n
    "},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"

    \"mpp;mpx\"

    "},{"location":"applications/planner/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"mpp;mpx\"

    "},{"location":"applications/planner/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"
    planner.Planner\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/planner/#json-dump","title":"JSON dump","text":"

    json source file planner.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"planner\",\n    \"icon\": \"planner.svg\",\n    \"launch\": \"planner.Planner\",\n    \"name\": \"Planner\",\n    \"path\": \"/usr/bin/planner\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/x-planner;\",\n    \"fileextensions\": \"mpp;mpx\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"mpp;mpx\"\n}\n
    "},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
    "},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Planner

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
    "},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
    "},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
    "},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/postman/#displayname","title":"Displayname","text":"
    Postman\n
    "},{"location":"applications/postman/#path","title":"Path","text":"
    /usr/local/bin/Postman/app/Postman\n
    "},{"location":"applications/postman/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"
    postman.Postman\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/postman/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
    "},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"

    json source file postman.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n    ],\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"installrecommends\": false,\n    \"icon\": \"circle_postman.svg\",\n    \"keyword\": \"http,post,json\",\n    \"launch\": \"postman.Postman\",\n    \"displayname\": \"Postman\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"postman\",\n    \"path\": \"/usr/local/bin/Postman/app/Postman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
    "},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
    "},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application postman

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
    "},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
    "},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
    "},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/powershell/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"
    powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
    "},{"location":"applications/powershell/#arguments","title":"Arguments","text":"

    \"--class=powershell -- /usr/bin/pwsh\"

    "},{"location":"applications/powershell/#displayname","title":"Displayname","text":"
    Powershell\n
    "},{"location":"applications/powershell/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"
    application/hlp;\n
    "},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"

    \"hlp;\"

    "},{"location":"applications/powershell/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.powershell\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/powershell/#json-dump","title":"JSON dump","text":"

    json source file powershell.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n    \"icon\": \"powershell.svg\",\n    \"keyword\": \"powershell\",\n    \"launch\": \"gnome-terminal-server.powershell\",\n    \"name\": \"powershell\",\n    \"displayname\": \"Powershell\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
    "},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application powershell

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
    "},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
    "},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
    "},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"
    putty\n
    "},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"
    Putty Unix\n
    "},{"location":"applications/putty-unix/#path","title":"Path","text":"
    /usr/bin/putty\n
    "},{"location":"applications/putty-unix/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"
    putty.Putty\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/putty-unix/#json-dump","title":"JSON dump","text":"

    json source file putty-unix.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"putty\",\n    \"icon\": \"circle_putty-unix.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.Putty\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-unix\",\n    \"displayname\": \"Putty Unix\",\n    \"path\": \"/usr/bin/putty\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
    "},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application putty-unix

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
    "},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
    "},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
    "},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"

    \"/composer/bin/putty.exe\"

    "},{"location":"applications/putty-wine/#displayname","title":"Displayname","text":"
    Putty Wine (alpine)\n
    "},{"location":"applications/putty-wine/#path","title":"Path","text":"
    /usr/bin/wine64\n
    "},{"location":"applications/putty-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"
    putty.exe.putty.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/putty-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
    "},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"

    json source file putty-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"RUN mkdir -p /composer/bin\",\n        \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n    ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"wine,putty,ssh,terminal\",\n    \"launch\": \"putty.exe.putty.exe\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine (alpine)\",\n    \"path\": \"/usr/bin/wine64\"\n}\n
    "},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
    "},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application putty-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
    "},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
    "},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
    "},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"

    ubuntu

    "},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"
    qelectrotech\n
    "},{"location":"applications/qelectrotech/#path","title":"Path","text":"
    /usr/bin/qelectrotech\n
    "},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"
    qelectrotech.Qelectrotech\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/qelectrotech/#json-dump","title":"JSON dump","text":"

    json source file qelectrotech.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qelectrotech\",\n    \"icon\": \"qelectrotech.svg\",\n    \"keyword\": \"qelectrotech\",\n    \"launch\": \"qelectrotech.Qelectrotech\",\n    \"name\": \"qElectrotech\",\n    \"path\": \"/usr/bin/qelectrotech\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
    "},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application qElectrotech

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
    "},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
    "},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
    "},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"
    Remarkable\n
    "},{"location":"applications/remarkable/#path","title":"Path","text":"
    /usr/bin/remarkable\n
    "},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"
    text/x-markdown;text/markdown;\n
    "},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"

    \"md;markdown\"

    "},{"location":"applications/remarkable/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"md;markdown\"

    "},{"location":"applications/remarkable/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"
    remarkable.Remarkable\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remarkable/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remarkable.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"

    json source file remarkable.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"remarkable.svg\",\n    \"keyword\": \"markdown,editor\",\n    \"launch\": \"remarkable.Remarkable\",\n    \"name\": \"remarkable\",\n    \"displayname\": \"Remarkable\",\n    \"path\": \"/usr/bin/remarkable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/x-markdown;text/markdown;\",\n    \"legacyfileextensions\": \"md;markdown\",\n    \"fileextensions\": \"md;markdown\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
    "},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remarkable

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
    "},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
    "},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
    "},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/remmina/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"
    remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
    "},{"location":"applications/remmina/#displayname","title":"Displayname","text":"
    Remmina\n
    "},{"location":"applications/remmina/#path","title":"Path","text":"
    /usr/bin/remmina\n
    "},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"
    application/x-remmina;\n
    "},{"location":"applications/remmina/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"
    remmina.Remmina\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remmina/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remmina-file.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"

    json source file remmina.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n    \"icon\": \"remmina.svg\",\n    \"keyword\": \"rdp,tsclient\",\n    \"launch\": \"remmina.Remmina\",\n    \"name\": \"remmina\",\n    \"displayname\": \"Remmina\",\n    \"args\": \"\",\n    \"path\": \"/usr/bin/remmina\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/x-remmina;\",\n    \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
    "},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remmina

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
    "},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
    "},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
    "},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"
    gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
    "},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"
    RemoteDesktop\n
    "},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"
    /bin/remotedesktopmanager.free\n
    "},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"
    RemoteDesktopManager.Free.RemoteDesktopManager.Free\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remotedesktopmanager/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remotedesktopmanager.free.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
    "},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"

    json source file remotedesktopmanager.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n    \"icon\": \"circle-remotedesktopmanager.svg\",\n    \"keyword\": \"remote,desktop,ssh\",\n    \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n    \"name\": \"remotedesktopmanager\",\n    \"displayname\": \"RemoteDesktop\",\n    \"path\": \"/bin/remotedesktopmanager.free\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"\",\n    \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n        \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n        \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n    ]\n}\n
    "},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
    "},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remotedesktopmanager

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
    "},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
    "},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
    "},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"
    rhythmbox\n
    "},{"location":"applications/rhythmbox/#path","title":"Path","text":"
    /usr/bin/rhythmbox\n
    "},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"
    application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
    "},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"
    rhythmbox.Rhythmbox\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/rhythmbox/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Rhythmbox3.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"

    json source file rhythmbox.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"rhythmbox\",\n    \"icon\": \"circle_rhythmbox.svg\",\n    \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n    \"launch\": \"rhythmbox.Rhythmbox\",\n    \"name\": \"rhythmbox\",\n    \"path\": \"/usr/bin/rhythmbox\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
    "},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
    "},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application rhythmbox

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
    "},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
    "},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
    "},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/robots/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-robots\n
    "},{"location":"applications/robots/#path","title":"Path","text":"
    /usr/games/gnome-robots\n
    "},{"location":"applications/robots/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"
    gnome-robots.Gnome-robots\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/robots/#desktopfile","title":"Desktopfile","text":"
    gnome-robots.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"

    json source file robots.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-robots\",\n    \"icon\": \"circle_gnome-robots.svg\",\n    \"keyword\": \"gnome robots,game robots,robots\",\n    \"launch\": \"gnome-robots.Gnome-robots\",\n    \"name\": \"Robots\",\n    \"path\": \"/usr/games/gnome-robots\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"gnome-robots.desktop\"\n}\n
    "},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
    "},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Robots

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
    "},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
    "},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
    "},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"
    shotcut mesa-dri-gallium\n
    "},{"location":"applications/shotcut/#path","title":"Path","text":"
    /usr/bin/shotcut\n
    "},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"
    image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
    "},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"

    \"mlt\"

    "},{"location":"applications/shotcut/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"mlt\"

    "},{"location":"applications/shotcut/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"
    shotcut.Shotcut\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/shotcut/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.shotcut.Shotcut.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"

    json source file shotcut.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"shotcut mesa-dri-gallium\",\n    \"icon\": \"circle_shotcut.svg\",\n    \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n    \"launch\": \"shotcut.Shotcut\",\n    \"name\": \"Shotcut\",\n    \"path\": \"/usr/bin/shotcut\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n    \"fileextensions\": \"mlt\",\n    \"legacyfileextensions\": \"mlt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
    "},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Shotcut

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
    "},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
    "},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
    "},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"
    stellarium\n
    "},{"location":"applications/stellarium/#path","title":"Path","text":"
    /usr/bin/stellarium\n
    "},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"
    application/x-stellarium-script;\n
    "},{"location":"applications/stellarium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"
    stellarium.stellarium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/stellarium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.stellarium.Stellarium.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"

    json source file stellarium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"stellarium\",\n    \"icon\": \"stellarium.svg\",\n    \"keyword\": \"stellarium,astronomy\",\n    \"launch\": \"stellarium.stellarium\",\n    \"name\": \"Stellarium\",\n    \"path\": \"/usr/bin/stellarium\",\n    \"mimetype\": \"application/x-stellarium-script;\",\n    \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
    "},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Stellarium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
    "},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
    "},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
    "},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/step/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"
    step\n
    "},{"location":"applications/step/#path","title":"Path","text":"
    /usr/bin/step\n
    "},{"location":"applications/step/#mimetype","title":"Mimetype","text":"
    application/x-step;\n
    "},{"location":"applications/step/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"
    step.step\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/step/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.step.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/step/#json-dump","title":"JSON dump","text":"

    json source file step.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"step\",\n    \"icon\": \"step.svg\",\n    \"keyword\": \"step\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"launch\": \"step.step\",\n    \"name\": \"Step\",\n    \"path\": \"/usr/bin/step\",\n    \"mimetype\": \"application/x-step;\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
    "},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Step

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
    "},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
    "},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
    "},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/stress/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"
    at-spi2-core gnome-terminal dbus-x11 stress\n
    "},{"location":"applications/stress/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=stress\"

    "},{"location":"applications/stress/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/stress/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.stress\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/stress/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"

    json source file stress.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n    \"icon\": \"stress.svg\",\n    \"keyword\": \"stress,cpu,shell\",\n    \"launch\": \"gnome-terminal-server.stress\",\n    \"name\": \"stress\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=stress\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
    "},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
    "},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application stress

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
    "},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
    "},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
    "},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"
    sublime-text\n
    "},{"location":"applications/sublime-text/#path","title":"Path","text":"
    /opt/sublime_text/sublime_text\n
    "},{"location":"applications/sublime-text/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"
    sublime_text.Sublime_text\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/sublime-text/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/sublime_text.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
    "},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"

    json source file sublime-text.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n        \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n    ],\n    \"debpackage\": \"sublime-text\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_sublime-text.svg\",\n    \"keyword\": \"ide,code,sublime-text\",\n    \"launch\": \"sublime_text.Sublime_text\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"sublime-Text\",\n    \"path\": \"/opt/sublime_text/sublime_text\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
    "},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
    "},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application sublime-Text

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
    "},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
    "},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
    "},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"
    gnome-sudoku\n
    "},{"location":"applications/sudoku/#path","title":"Path","text":"
    /usr/bin/gnome-sudoku\n
    "},{"location":"applications/sudoku/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Sudoku.org.gnome.Sudoku\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/sudoku/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Sudoku.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"

    json source file sudoku.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-sudoku\",\n    \"icon\": \"org.gnome.Sudoku.svg\",\n    \"keyword\": \"sudoku\",\n    \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n    \"name\": \"sudoku\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-sudoku\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
    "},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
    "},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application sudoku

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
    "},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
    "},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
    "},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpinei.minimal

    "},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"

    alpine

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"
    supertux mesa-gl mesa-egl mesa-dri-gallium\n
    "},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"
    supertux2\n
    "},{"location":"applications/supertux2/#path","title":"Path","text":"
    /usr/games/supertux2\n
    "},{"location":"applications/supertux2/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"
    supertux2.supertux2\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/supertux2/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/supertux2.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"

    json source file supertux2.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n    \"icon\": \"circle_supertux.svg\",\n    \"keyword\": \"supertux\",\n    \"launch\": \"supertux2.supertux2\",\n    \"name\": \"supertux2\",\n    \"displayname\": \"supertux2\",\n    \"path\": \"/usr/games/supertux2\",\n    \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n    \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
    "},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
    "},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application supertux2

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
    "},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
    "},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
    "},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"
    swell-foop\n
    "},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"
    swell-foop\n
    "},{"location":"applications/swell-foop/#path","title":"Path","text":"
    /usr/games/swell-foop\n
    "},{"location":"applications/swell-foop/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"
    swell-foop.Swell-foop\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/swell-foop/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.SwellFoop.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"

    json source file swell-foop.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"swell-foop\",\n    \"icon\": \"circle_swell-foop.svg\",\n    \"keyword\": \"swell,foop\",\n    \"launch\": \"swell-foop.Swell-foop\",\n    \"name\": \"swell-foop\",\n    \"displayname\": \"swell-foop\",\n    \"path\": \"/usr/games/swell-foop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
    "},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
    "},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application swell-foop

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
    "},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
    "},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
    "},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/taquin/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"
    gnome-taquin\n
    "},{"location":"applications/taquin/#path","title":"Path","text":"
    /usr/bin/gnome-taquin\n
    "},{"location":"applications/taquin/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Taquin.org.gnome.Weather\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/taquin/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Taquin.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"

    json source file taquin.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-taquin\",\n    \"icon\": \"org.gnome.Taquin.svg\",\n    \"keyword\": \"taquin\",\n    \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n    \"name\": \"taquin\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-taquin\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
    "},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
    "},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application taquin

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
    "},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
    "},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
    "},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/teams/#arguments","title":"Arguments","text":"

    \"--disable-namespace-sandbox --disable-setuid-sandbox\"

    "},{"location":"applications/teams/#displayname","title":"Displayname","text":"
    Microsoft Teams\n
    "},{"location":"applications/teams/#path","title":"Path","text":"
    /usr/bin/teams\n
    "},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/msteams;\n
    "},{"location":"applications/teams/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"
    microsoft teams - preview.Microsoft Teams - Preview\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/teams/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/teams.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"

    json source file teams.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"icon\": \"teams.svg\",\n    \"keyword\": \"teams\",\n    \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n    \"name\": \"teams\",\n    \"displayname\": \"Microsoft Teams\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/teams\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/msteams;\",\n    \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
    "},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application teams

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
    "},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
    "},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
    "},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/terminal/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/terminal/#arguments","title":"Arguments","text":"

    \"--disable-factory\"

    "},{"location":"applications/terminal/#displayname","title":"Displayname","text":"
    Terminal sudo\n
    "},{"location":"applications/terminal/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminal/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/terminal/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.Gnome-terminal\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminal/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"

    json source file terminal.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n    \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n    \"name\": \"Terminal\",\n    \"displayname\": \"Terminal sudo\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
    "},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Terminal

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
    "},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
    "},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
    "},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.fulldev.ia

    "},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"

    gnome-terminal dbus-x11

    "},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=terminalai\"

    "},{"location":"applications/terminalai/#display-name","title":"Display name","text":"

    \"Shell AI\"

    "},{"location":"applications/terminalai/#path","title":"path","text":"

    \"/usr/bin/gnome-terminal\"

    "},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"
    at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
    "},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=ephemeral\"

    "},{"location":"applications/terminalephemeral/#displayname","title":"Displayname","text":"
    Terminal [ephemeral container]\n
    "},{"location":"applications/terminalephemeral/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.ephemeral\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminalephemeral/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"

    json source file terminalephemeral.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"ephemeral,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.ephemeral\",\n    \"name\": \"terminalephemeral\",\n    \"displayname\": \"Terminal [ephemeral container]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=ephemeral\",\n    \"containerengine\": \"ephemeral_container\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
    "},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
    "},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application terminalephemeral

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
    "},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
    "},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
    "},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"
    pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
    "},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=pod\"

    "},{"location":"applications/terminalpod/#displayname","title":"Displayname","text":"
    Terminal [Pod]\n
    "},{"location":"applications/terminalpod/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminalpod/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.pod\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminalpod/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"

    json source file terminalpod.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"pod,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.pod\",\n    \"name\": \"terminalpod\",\n    \"displayname\": \"Terminal [Pod]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=pod\",\n    \"containerengine\": \"pod_application\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
    "},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
    "},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application terminalpod

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
    "},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
    "},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
    "},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-tetravex\n
    "},{"location":"applications/tetravex/#path","title":"Path","text":"
    /usr/games/gnome-tetravex\n
    "},{"location":"applications/tetravex/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"
    gnome-tetravex.Gnome-tetravex\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/tetravex/#json-dump","title":"JSON dump","text":"

    json source file tetravex.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-tetravex\",\n    \"icon\": \"gnome-tetravex.svg\",\n    \"keyword\": \"game\",\n    \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n    \"name\": \"Tetravex\",\n    \"path\": \"/usr/games/gnome-tetravex\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktop\": \"gnome-tetravex.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    }\n}\n
    "},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
    "},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Tetravex

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
    "},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
    "},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
    "},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"
    tk thunderbird gnome-keyring\n
    "},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"
    Thunderbird\n
    "},{"location":"applications/thunderbird/#path","title":"Path","text":"
    /usr/bin/thunderbird\n
    "},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/mailto\n
    "},{"location":"applications/thunderbird/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"
    Mail.Thunderbird\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/thunderbird/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/thunderbird.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"

    json source file thunderbird.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"tk thunderbird gnome-keyring\",\n    \"icon\": \"thunderbird.svg\",\n    \"keyword\": \"mail\",\n    \"launch\": \"Mail.Thunderbird\",\n    \"name\": \"thunderbird\",\n    \"displayname\": \"Thunderbird\",\n    \"path\": \"/usr/bin/thunderbird\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/mailto\",\n    \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
    "},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
    "},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application thunderbird

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
    "},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
    "},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
    "},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/vice/#displayname","title":"Displayname","text":"
    Commodore64\n
    "},{"location":"applications/vice/#path","title":"Path","text":"
    /usr/bin/x64\n
    "},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"

    \"crt;bin\"

    "},{"location":"applications/vice/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"
    x64.X64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vice/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/x64.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
    "},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"

    json source file vice.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n        \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n        \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"c64.svg\",\n    \"keyword\": \"x64,vice,commodore,c64\",\n    \"launch\": \"x64.X64\",\n    \"name\": \"vice\",\n    \"displayname\": \"Commodore64\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/x64\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"fileextensions\": \"crt;bin\",\n    \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
    "},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vice

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
    "},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
    "},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
    "},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/vlc/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"
    ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
    "},{"location":"applications/vlc/#displayname","title":"Displayname","text":"
    videolan\n
    "},{"location":"applications/vlc/#path","title":"Path","text":"
    /usr/bin/vlc\n
    "},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"
    video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
    "},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"

    \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"

    "},{"location":"applications/vlc/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"
    vlc.vlc\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vlc/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/vlc.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"

    json source file vlc.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office,graphics\",\n    \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n    \"icon\": \"circle_vlc.svg\",\n    \"keyword\": \"vlc, videolan, video, lan, dvd\",\n    \"launch\": \"vlc.vlc\",\n    \"name\": \"vlc\",\n    \"displayname\": \"videolan\",\n    \"path\": \"/usr/bin/vlc\",\n    \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n    \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
    "},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vlc

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
    "},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
    "},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
    "},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"

    abcdesktop/docker-osx

    "},{"location":"applications/vmmacos/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"
    qemu.Qemu-system-x86_64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmmacos/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN yes | sudo pacman -S xorg-xauth\n
    "},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"

    json source file vmmacos.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"RUN yes | sudo pacman -S xorg-xauth\"\n    ],\n    \"icon\": \"MacOS_logo.svg\",\n    \"keyword\": \"macos,apple\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmmacos\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktop/docker-osx\",\n    \"workdir\": \"/home/arch/OSX-KVM\",\n    \"user\": \"arch\",\n    \"home\": \"/home/arch\",\n    \"cmd\": [\n        \"/bin/bash\",\n        \"-c\",\n        \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true     ; [[ \\\"${NOPICKER}\\\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\"     ; }     || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"     ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\\\"${MASTER_PLIST_URL}\\\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\"   --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"             --output-env \\\"${ENV:=/env}\\\" || exit 1 ; }     ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && {             source \\\"${ENV:=/env}\\\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\"             --serial \\\"${SERIAL}\\\"             --board-serial \\\"${BOARD_SERIAL}\\\"             --uuid \\\"${UUID}\\\"             --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\"             --height \\\"${HEIGHT:-1080}\\\"             --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\"\n    ]\n}\n
    "},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
    "},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true     ; [[ \"${NOPICKER}\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\"     ; }     || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"     ; [[ \"${GENERATE_UNIQUE}\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\"${MASTER_PLIST_URL}\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\"   --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"             --output-env \"${ENV:=/env}\" || exit 1 ; }     ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && {             source \"${ENV:=/env}\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\"             --serial \"${SERIAL}\"             --board-serial \"${BOARD_SERIAL}\"             --uuid \"${UUID}\"             --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\"             --height \"${HEIGHT:-1080}\"             --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\" ]\n\n
    "},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmmacos

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
    "},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
    "},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
    "},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/vmrc/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"
    VMRC\n
    "},{"location":"applications/vmrc/#path","title":"Path","text":"
    /usr/bin/vmrc\n
    "},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/vmrc;\n
    "},{"location":"applications/vmrc/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"
    vmrc.Vmrc\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmrc/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/vmware-vmrc.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
    "},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"

    json source file vmrc.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_vmware.svg\",\n    \"keyword\": \"vmrc,vmware,remote,console\",\n    \"launch\": \"vmrc.Vmrc\",\n    \"name\": \"vmrc\",\n    \"displayname\": \"VMRC\",\n    \"path\": \"/usr/bin/vmrc\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"x-scheme-handler/vmrc;\",\n    \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\",\n        \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n        \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n        \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n    ]\n}\n
    "},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
    "},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmrc

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
    "},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
    "},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
    "},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.vm.ubuntu:22.04

    "},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"
    qemu.Qemu-system-x86_64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmubuntu/#json-dump","title":"JSON dump","text":"

    json source file vmubuntu.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"icon\": \"vm-linux-ubuntu.svg\",\n    \"keyword\": \"vm,ubuntu,jammy\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmubuntu\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n    \"home\": \"/home/balloon\",\n    \"cmd\": \"/docker-entrypoint.sh\"\n}\n
    "},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
    "},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmubuntu

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
    "},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
    "},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
    "},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/vscode/#arguments","title":"Arguments","text":"

    \"--extensions-dir /usr/share/code/extensions --verbose\"

    "},{"location":"applications/vscode/#path","title":"Path","text":"
    /usr/bin/code\n
    "},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"
    text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
    "},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"

    \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"

    "},{"location":"applications/vscode/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"c;cpp;py;json;java;md;yml;yaml;\"

    "},{"location":"applications/vscode/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"
    code.Code\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vscode/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/code.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
    "},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"

    json source file vscode.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_visual-studio-code.svg\",\n    \"keyword\": \"ide,vscode,visual studio code,code\",\n    \"launch\": \"code.Code\",\n    \"name\": \"VSCode\",\n    \"path\": \"/usr/bin/code\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"code.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"cap_add\": [\n            \"SYS_ADMIN\"\n        ]\n    },\n    \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n    \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n    \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n    \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n    \"desktopfile\": \"/usr/share/applications/code.desktop\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n    ],\n    \"quick\": true\n}\n
    "},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
    "},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application VSCode

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
    "},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
    "},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
    "},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/weather/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"
    gnome-weather\n
    "},{"location":"applications/weather/#path","title":"Path","text":"
    /usr/bin/gnome-weather\n
    "},{"location":"applications/weather/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Weather.org.gnome.Weather\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/weather/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Weather.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"

    json source file weather.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnome-weather\",\n    \"icon\": \"org.gnome.Weather.svg\",\n    \"keyword\": \"weather\",\n    \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n    \"name\": \"weather\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-weather\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
    "},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
    "},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application weather

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
    "},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
    "},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
    "},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11\n
    "},{"location":"applications/whatsdesk/#path","title":"Path","text":"
    /opt/whatsdesk/whatsdesk\n
    "},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/whatsapp;\n
    "},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"
    whatsdesk.whatsdesk\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/whatsdesk/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/whatsdesk.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"

    json source file whatsdesk.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"dbus-x11\",\n    \"icon\": \"whatsapp.svg\",\n    \"keyword\": \"whatsapp,whatsdesk\",\n    \"launch\": \"whatsdesk.whatsdesk\",\n    \"name\": \"whatsdesk\",\n    \"path\": \"/opt/whatsdesk/whatsdesk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n    \"mimetype\": \"x-scheme-handler/whatsapp;\",\n    \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
    "},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
    "},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application whatsdesk

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
    "},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
    "},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
    "},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"
    Winefile Wine (alpine)\n
    "},{"location":"applications/winefile-wine/#path","title":"Path","text":"
    /usr/bin/winefile\n
    "},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"
    winefile.exe.winefile.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winefile-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"

    json source file winefile-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"winefile.svg\",\n    \"keyword\": \"wine,winfile,winefile,file,manager\",\n    \"launch\": \"winefile.exe.winefile.exe\",\n    \"name\": \"winefile-wine\",\n    \"displayname\": \"Winefile Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winefile\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
    "},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winefile-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
    "},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
    "},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
    "},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"
    WineMine Wine (alpine)\n
    "},{"location":"applications/winemine-wine/#path","title":"Path","text":"
    /usr/bin/winemine\n
    "},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"
    winemine.exe.winemine.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winemine-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
    "},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"

    json source file winemine-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"wine\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n    ],\n    \"icon\": \"winemine.svg\",\n    \"keyword\": \"wine,winemine,mine\",\n    \"launch\": \"winemine.exe.winemine.exe\",\n    \"name\": \"winemine-wine\",\n    \"displayname\": \"WineMine Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winemine\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
    "},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winemine-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
    "},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
    "},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
    "},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.wine

    "},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"

    \"winhelp\"

    "},{"location":"applications/winhelp-wine/#displayname","title":"Displayname","text":"
    Winhelp Wine\n
    "},{"location":"applications/winhelp-wine/#path","title":"Path","text":"
    /usr/bin/wine\n
    "},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"
    application/hlp;\n
    "},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"

    \"hlp;\"

    "},{"location":"applications/winhelp-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"
    winhlp32.exe.Wine\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winhelp-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
    "},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"

    json source file winhelp-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"winhelp\",\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"winhelp.svg\",\n    \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n    \"launch\": \"winhlp32.exe.Wine\",\n    \"name\": \"winhelp-wine\",\n    \"displayname\": \"Winhelp Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/wine\",\n    \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
    "},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
    "},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winhelp-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
    "},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
    "},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
    "},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.wine

    "},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"

    \"/composer/bin/winscp.exe\"

    "},{"location":"applications/winscp-wine/#displayname","title":"Displayname","text":"
    WinSCP\n
    "},{"location":"applications/winscp-wine/#path","title":"Path","text":"
    /usr/bin/wine\n
    "},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"
    winscp.exe.Wine\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winscp-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
    "},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"

    json source file winscp-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.wine\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"args\": \"/composer/bin/winscp.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"winscp.svg\",\n    \"keyword\": \"wine,scp,sftp\",\n    \"launch\": \"winscp.exe.Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"winscp-wine\",\n    \"displayname\": \"WinSCP\",\n    \"path\": \"/usr/bin/wine\"\n}\n
    "},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
    "},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winscp-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
    "},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
    "},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
    "},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"
    wireshark\n
    "},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"
    wireshark (alpine)\n
    "},{"location":"applications/wireshark/#path","title":"Path","text":"
    /usr/bin/wireshark\n
    "},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"
    application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
    "},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"

    \"cap,pcap\"

    "},{"location":"applications/wireshark/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"cap\"

    "},{"location":"applications/wireshark/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"
    wireshark.Wireshark\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/wireshark/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.wireshark.Wireshark.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV QT_XCB_NO_MITSHM=1\n
    "},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"

    json source file wireshark.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV QT_XCB_NO_MITSHM=1\"\n    ],\n    \"apkpackage\": \"wireshark\",\n    \"icon\": \"wireshark.svg\",\n    \"keyword\": \"capture,network,analyzer\",\n    \"launch\": \"wireshark.Wireshark\",\n    \"name\": \"wireshark\",\n    \"displayname\": \"wireshark (alpine)\",\n    \"path\": \"/usr/bin/wireshark\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n    \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n    \"fileextensions\": \"cap,pcap\",\n    \"legacyfileextensions\": \"cap\"\n}\n
    "},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
    "},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application wireshark

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
    "},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
    "},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
    "},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/writer/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/writer/#arguments","title":"Arguments","text":"

    \"--writer\"

    "},{"location":"applications/writer/#displayname","title":"Displayname","text":"
    Writer alpine\n
    "},{"location":"applications/writer/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/writer/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
    "},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"

    \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"

    "},{"location":"applications/writer/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odf;ott;fodt;uot\"

    "},{"location":"applications/writer/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-writer\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/writer/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-writer.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"

    json source file writer.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_writer.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-writer\",\n    \"name\": \"writer\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Writer alpine\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"args\": \"--writer\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n    \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n    \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
    "},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application writer

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
    "},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
    "},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
    "},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/xclock/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"
    xclock\n
    "},{"location":"applications/xclock/#displayname","title":"Displayname","text":"
    Xclock\n
    "},{"location":"applications/xclock/#path","title":"Path","text":"
    /usr/bin/xclock\n
    "},{"location":"applications/xclock/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"
    xclock.XClock\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xclock/#json-dump","title":"JSON dump","text":"

    json source file xclock.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"xclock\",\n    \"icon\": \"xclock.svg\",\n    \"keyword\": \"clock,xclock,time\",\n    \"launch\": \"xclock.XClock\",\n    \"name\": \"xclock\",\n    \"displayname\": \"Xclock\",\n    \"path\": \"/usr/bin/xclock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
    "},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xclock

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
    "},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
    "},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
    "},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/xedit/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"
    x11-apps x11-utils xbitmaps\n
    "},{"location":"applications/xedit/#displayname","title":"Displayname","text":"
    Xedit\n
    "},{"location":"applications/xedit/#path","title":"Path","text":"
    /usr/bin/xedit\n
    "},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"
    application/text;\n
    "},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"

    \"txt;log;md\"

    "},{"location":"applications/xedit/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"
    xedit.Xedit\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xedit/#json-dump","title":"JSON dump","text":"

    json source file xedit.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n    \"icon\": \"circle_xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;md\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
    "},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xedit

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
    "},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
    "},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
    "},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"
    xeyes\n
    "},{"location":"applications/xeyes/#path","title":"Path","text":"
    /usr/bin/xeyes\n
    "},{"location":"applications/xeyes/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"
    xeyes.XEyes\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xeyes/#json-dump","title":"JSON dump","text":"

    json source file xeyes.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"xeyes\",\n    \"icon\": \"circle_xfce4-eyes.svg\",\n    \"keyword\": \"eyes\",\n    \"launch\": \"xeyes.XEyes\",\n    \"name\": \"xeyes\",\n    \"path\": \"/usr/bin/xeyes\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
    "},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xeyes

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
    "},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
    "},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
    "},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/xman/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"
    x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
    "},{"location":"applications/xman/#displayname","title":"Displayname","text":"
    Xman\n
    "},{"location":"applications/xman/#path","title":"Path","text":"
    /usr/bin/xman\n
    "},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"
    application/x-troff;application/x-troff-man;\n
    "},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"

    \"man;roff\"

    "},{"location":"applications/xman/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"
    topBox.Xman\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xman/#json-dump","title":"JSON dump","text":"

    json source file xman.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n    \"icon\": \"circle_xorg.svg\",\n    \"keyword\": \"man,xman,help\",\n    \"launch\": \"topBox.Xman\",\n    \"name\": \"xman\",\n    \"displayname\": \"Xman\",\n    \"path\": \"/usr/bin/xman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n    \"fileextensions\": \"man;roff\",\n    \"args\": \"\"\n}\n
    "},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
    "},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xman

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
    "},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
    "},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
    "},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/xpad/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"
    xpad\n
    "},{"location":"applications/xpad/#displayname","title":"Displayname","text":"
    Xpad\n
    "},{"location":"applications/xpad/#path","title":"Path","text":"
    /usr/bin/xpad\n
    "},{"location":"applications/xpad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"
    xpad.xpad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xpad/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/xpad.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
    "},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"

    json source file xpad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"xpad\",\n    \"icon\": \"xpad.svg\",\n    \"keyword\": \"xpad, note, sticky, postit\",\n    \"launch\": \"xpad.xpad\",\n    \"name\": \"xpad\",\n    \"displayname\": \"Xpad\",\n    \"path\": \"/usr/bin/xpad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n    ]\n}\n
    "},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
    "},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xpad

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
    "},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
    "},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
    "},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/xterm/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"
    xterm sudo\n
    "},{"location":"applications/xterm/#arguments","title":"Arguments","text":"

    \"-xrm 'XTerm*selectToClipboard:true'\"

    "},{"location":"applications/xterm/#displayname","title":"Displayname","text":"
    Xterm (sudo)\n
    "},{"location":"applications/xterm/#path","title":"Path","text":"
    /usr/bin/xterm\n
    "},{"location":"applications/xterm/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"
    xterm.XTerm\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xterm/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/xterm.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"

    json source file xterm.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"circle_xterm.svg\",\n    \"apkpackage\": \"xterm sudo\",\n    \"keyword\": \"xterm,shell,cmd\",\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"xterm\",\n    \"displayname\": \"Xterm (sudo)\",\n    \"path\": \"/usr/bin/xterm\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n    \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"quick\": true\n}\n
    "},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
    "},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xterm

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
    "},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
    "},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
    "},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/youtube/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"
    firefox\n
    "},{"location":"applications/youtube/#arguments","title":"Arguments","text":"

    \"-P youtube --class=youtube https://www.youtube.com/\"

    "},{"location":"applications/youtube/#displayname","title":"Displayname","text":"
    Youtube\n
    "},{"location":"applications/youtube/#path","title":"Path","text":"
    /usr/bin/firefox\n
    "},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/youtube/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/youtube/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"
    Navigator.youtube\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/youtube/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
    "},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"firefox\",\n    \"icon\": \"circle_youtube.svg\",\n    \"keyword\": \"youtube,tube\",\n    \"launch\": \"Navigator.youtube\",\n    \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n    \"name\": \"youtube\",\n    \"displayname\": \"Youtube\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\"\n    },\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"preventhomemount\": false,\n    \"quick\": true,\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n    ]\n}\n
    "},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
    "},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application youtube

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
    "},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
    "},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.3.17

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.3.17.md is created at Sat Nov 30 2024 22:37:24 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.3.18

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.9\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.3.18.md is created at Sat Nov 30 2024 22:37:15 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.edge.gtk

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

    file oc.template.alpine.edge.gtk.libreoffice.md is created at Sun Dec 01 2024 12:08:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

    file oc.template.alpine.edge.gtk.md is created at Sun Dec 01 2024 11:56:35 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.edge.md is created at Sat Nov 30 2024 22:37:13 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

    file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

    file oc.template.alpine.libreoffice.md is created at Sun Dec 01 2024 12:08:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.md is created at Sat Nov 30 2024 22:37:29 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"

    Docker official images alpine:3.17

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.10\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.17.md is created at Sat Nov 30 2024 22:23:01 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"

    Docker official images alpine:3.18

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.9\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.18.md is created at Sat Nov 30 2024 22:22:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/","title":"oc.template.alpine.minimal.3.19","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#from","title":"from","text":"

    Docker official images alpine:3.19

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.4\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.19.md is created at Sat Nov 30 2024 22:22:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/","title":"oc.template.alpine.minimal.3.20","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#from","title":"from","text":"

    Docker official images alpine:3.20

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.20.md is created at Sat Nov 30 2024 22:22:59 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"

    Docker official images alpine:edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.edge.md is created at Sat Nov 30 2024 22:23:11 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"

    Docker official images alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.md is created at Sat Nov 30 2024 22:23:07 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64'  ]; then apk add --no-cache --update wine; fi\n\n

    file oc.template.alpine.wine.md is created at Sun Dec 01 2024 12:10:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.debian

    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.debian.gtk.md is created at Sun Dec 01 2024 12:02:41 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.debian.minimal

    "},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.debian.md is created at Sat Nov 30 2024 22:37:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"

    Docker official images debian:stable-slim

    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg                              \\\n     software-properties-common         \\\n     locales                \\\n     cups-client            \\\n     libpulse0              \\\n     curl               \\\n     xauth              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_20.x | bash - \\\n        && apt-get update && \\\n        apt-get install -y --no-install-recommends \\\n        nodejs \\\n    && apt-get clean \\\n    && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.debian.minimal.md is created at Sat Nov 30 2024 22:27:14 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/","title":"oc.template.rockylinux.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.minimal.8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add some fonts\nRUN yum update -y && \\\n    yum install -y \\\n        google-noto-fonts-common \\\n        xorg-x11-fonts-100dpi \\\n        xorg-x11-fonts-75dpi \\\n    texlive-utopia \\\n    liberation-fonts-common \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.8.md is created at Sat Nov 30 2024 22:38:32 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/","title":"oc.template.rockylinux.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.minimal.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add some fonts\nRUN yum update -y && \\\n    yum install -y \\\n        google-noto-fonts-common \\\n        xorg-x11-fonts-100dpi \\\n        xorg-x11-fonts-75dpi \\\n    texlive-utopia \\\n    liberation-fonts-common \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.9.md is created at Sat Nov 30 2024 22:38:15 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/","title":"oc.template.rockylinux.gtk.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y \\\n        gtk3 \\\n        gnome-font-viewer \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.rockylinux.gtk.8.md is created at Sun Dec 01 2024 11:57:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/","title":"oc.template.rockylinux.gtk.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y \\\n        gtk3 \\\n        gnome-font-viewer \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.rockylinux.gtk.9.md is created at Sun Dec 01 2024 12:00:39 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/","title":"oc.template.rockylinux.gtk.libreoffice.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.gtk.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y --skip-broken libreoffice \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.gtk.libreoffice.9.md is created at Sun Dec 01 2024 12:09:21 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/","title":"oc.template.rockylinux.minimal.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#from","title":"from","text":"

    Docker official images rockylinux:8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.minimal.8.md is created at Sat Nov 30 2024 22:27:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/","title":"oc.template.rockylinux.minimal.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#from","title":"from","text":"

    Docker official images rockylinux:9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.minimal.9.md is created at Sat Nov 30 2024 22:25:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/","title":"oc.template.rockylinux.nvidia.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-rockylinux8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.nvidia.8.md is created at Sat Nov 30 2024 22:27:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/","title":"oc.template.rockylinux.nvidia.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-rockylinux9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.nvidia.9.md is created at Sat Nov 30 2024 22:25:59 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.18.04.md is created at Sat Nov 30 2024 22:37:31 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.20.04.md is created at Sat Nov 30 2024 22:37:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.22.04.md is created at Sat Nov 30 2024 22:37:42 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/","title":"oc.template.ubuntu.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.24.04.md is created at Sat Nov 30 2024 22:38:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.18.04.md is created at Sun Dec 01 2024 11:59:18 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.20.04.md is created at Sun Dec 01 2024 11:59:16 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.5 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.5 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.22.04.md is created at Sun Dec 01 2024 12:00:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/","title":"oc.template.ubuntu.gtk.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 24.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"24.04\"\nVERSION=\"24.04.1 LTS (Noble Numbat)\"\nVERSION_CODENAME=noble\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=noble\nLOGO=ubuntu-logo\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.24.04.md is created at Sun Dec 01 2024 12:06:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n        default-jre \\\n        gsfonts-x11     \\\n    && rm -rf /var/lib/apt/lists/*  \n\n

    file oc.template.ubuntu.gtk.java.md is created at Sun Dec 01 2024 12:08:08 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive  \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y  --no-install-recommends                       \\\n        $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }')      \\\n        && apt-get clean                                        \\\n        && rm -rf /var/lib/apt/lists/*\n\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y                \\\n    at-spi2-core                        \\\n        libreoffice                         \\\n    libreoffice-gtk3                    \\\n    libreoffice-style-elementary                \\\n    libreoffice-base-drivers                \\\n    libreoffice-sdbc-hsqldb                 \\\n    libghc-hdbc-dev                     \\   \n    && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-help | awk '{print $1 }')    \\\n#   && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y   \\       \n#        $(apt-cache search myspell-dictionary | awk '{print $1 }')     \\\n#       && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends           \\       \n#        $(apt-cache search hyphen | awk '{print $1 }')                 \\\n#    && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n#    && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-l10n | awk '{print $1 }')    \\\n#    && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends    \\\n        xfonts-base \\\n        dbus-x11    \\\n    && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.md is created at Sun Dec 01 2024 11:59:37 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"

    Docker official images ubuntu:18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.18.04.md is created at Sat Nov 30 2024 22:25:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"

    Docker official images ubuntu:20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.20.04.md is created at Sat Nov 30 2024 22:27:09 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"

    Docker official images ubuntu:22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.5 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.5 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.22.04.md is created at Sat Nov 30 2024 22:26:52 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/","title":"oc.template.ubuntu.minimal.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#from","title":"from","text":"

    Docker official images ubuntu:24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 24.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"24.04\"\nVERSION=\"24.04.1 LTS (Noble Numbat)\"\nVERSION_CODENAME=noble\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=noble\nLOGO=ubuntu-logo\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.24.04.md is created at Sat Nov 30 2024 22:36:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-ubuntu20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.nvidia.20.04.md is created at Sat Nov 30 2024 22:26:17 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-ubuntu22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.4 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.4 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.nvidia.22.04.md is created at Sat Nov 30 2024 22:26:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n       wget                             \\\n       && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n#   are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n#   for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aria2 \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes binutils \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n#    apt-get clean     \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes fuseiso && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes  p7zip-full policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#     apt-get install --no-install-recommends --yes  policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n#    apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n#    apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y   \\\n#   libnss-mdns-i386            \\\n#   libnss-mdns             \\ \n#   wine-stable &&          \\\n#   apt-get clean       \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb   &&  \\\n#     dpkg -i libfaudio0_19.07-0~bionic_amd64.deb                                           &&  \\\n#    rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb  &&  \\\n#    dpkg -i libfaudio0_19.07-0~bionic_i386.deb                                             &&  \\\n#    rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi      \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n    apt-get install --yes wine && \\\n    apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n    apt-get clean\n\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n    apt-get clean\n\nCOPY composer/updatereg.py              /composer\nCOPY composer/init.d/init.wine      /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine         /composer/init.d/_init.wine\nRUN  mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n

    file oc.template.ubuntu.wine.md is created at Sun Dec 01 2024 12:09:16 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.wine

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n    apt-get install --install-recommends -y \\\n    xterm \\\n    wget \\\n    netcat \\\n    file \\\n    winbind \\\n    gettext \\ \n    libgettextpo-dev \\\n    && rm -rf /var/lib/apt/lists/*  \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    libosmesa6:i386 \\\n        libnss-mdns \\\n    libnss-mdns:i386 \\\n    libncurses5:i386 \\\n    libodbc1:i386 \\\n    libxext6:i386 \\\n    libxi6:i386 \\\n    libfreetype6:i386 \\\n    libx11-6:i386 \\\n    libz1:i386 \\\n    libcups2:i386 \\\n    liblcms2-2:i386 \\\n    libglu1-mesa:i386 \\\n    libxcursor1:i386 \\\n    libxrandr2:i386 \\\n    libxml2:i386 \\\n    libgl1-mesa-dri:i386 \\\n    libgl1-mesa-glx:i386 \\\n    && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n   wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n   apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n   rm PlayOnLinux_4.3.4.deb && \\\n   rm -rf /var/lib/apt/lists/*\n\n

    file oc.template.ubuntu.wine.mswindow.md is created at Sun Dec 01 2024 12:11:26 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"
    #!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"
    NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"
    NAME=\"John\"\necho \"Hi $NAME\"  #=> Hi John\necho 'Hi $NAME'  #=> Hi $NAME\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"
    echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n

    See Command substitution

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"
    git commit && git push\ngit commit || echo \"Commit failed\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"

    {: id='functions-example'}

    get_name() {\n  echo \"John\"\n}\n\necho \"You are $(get_name)\"\n

    See: Functions

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"

    {: id='conditionals-example'}

    if [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n

    See: Conditionals

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"
    set -euo pipefail\nIFS=$'\\n\\t'\n

    See: Unofficial bash strict mode

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"
    echo {A,B}.js\n

    | {A,B} | Same as A B | | {A,B}.js | Same as A.js B.js | | {1..5} | Same as 1 2 3 4 5 |

    See: Brace expansion

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"
    name=\"John\"\necho ${name}\necho ${name/J/j}    #=> \"john\" (substitution)\necho ${name:0:2}    #=> \"Jo\" (slicing)\necho ${name::2}     #=> \"Jo\" (slicing)\necho ${name::-1}    #=> \"Joh\" (slicing)\necho ${name:(-1)}   #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake}  #=> $food or \"Cake\"\n
    length=2\necho ${name:0:length}  #=> \"Jo\"\n

    See: Parameter expansion

    STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp}    # /path/to/foo\necho ${STR%.cpp}.o  # /path/to/foo.o\n\necho ${STR##*.}     # cpp (extension)\necho ${STR##*/}     # foo.cpp (basepath)\n\necho ${STR#*/}      # path/to/foo.cpp\necho ${STR##*/}     # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
    STR=\"Hello world\"\necho ${STR:6:5}   # \"world\"\necho ${STR:-5:5}  # \"world\"\n
    SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/}   #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE}  #=> \"/path/to/\" (dirpath)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix} Remove suffix ${FOO#prefix} Remove prefix --- --- ${FOO%%suffix} Remove long suffix ${FOO##prefix} Remove long prefix --- --- ${FOO/from/to} Replace first match ${FOO//from/to} Replace all --- --- ${FOO/%from/to} Replace suffix ${FOO/#from/to} Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"
    # Single line comment\n
    : '\nThis is a\nmulti line\ncomment\n'\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"

    | ${FOO:0:3} | Substring (position, length) | | ${FOO:-3:3} | Substring from the right |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#length","title":"Length","text":"

    | ${#FOO} | Length of $FOO |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#manipulation","title":"Manipulation","text":"
    STR=\"HELLO WORLD!\"\necho ${STR,}   #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,}  #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^}   #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^}  #=> \"HELLO WORLD!\" (all uppercase)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"

    | ${FOO:-val} | $FOO, or val if not set | | ${FOO:=val} | Set $FOO to val if not set | | ${FOO:+val} | val if $FOO is set | | ${FOO:?message} | Show error message and exit if $FOO is not set |

    The : is optional (eg, ${FOO=word} works)

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#loops","title":"Loops","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"
    for i in /etc/rc.*; do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"
    for ((i = 0 ; i < 100 ; i++)); do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"
    for i in {1..5}; do\n    echo \"Welcome $i\"\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"
    for i in {5..50..5}; do\n    echo \"Welcome $i\"\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"
    cat file.txt | while read line; do\n  echo $line\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"
    while true; do\n  \u00b7\u00b7\u00b7\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"
    myfunc() {\n    echo \"hello $1\"\n}\n
    # Same as above (alternate syntax)\nfunction myfunc() {\n    echo \"hello $1\"\n}\n
    myfunc \"John\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"
    myfunc() {\n    local myresult='some value'\n    echo $myresult\n}\n
    result=\"$(myfunc)\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"
    myfunc() {\n  return 1\n}\n
    if myfunc; then\n  echo \"success\"\nelse\n  echo \"failure\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $# Number of arguments $* All arguments $@ All arguments, starting from first $1 First argument $_ Last argument of the previous command

    See Special parameters.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"

    Note that [[ is actually a command/program that returns either 0 (true) or 1 (false). Any program that obeys the same logic (like all base utils, such as grep(1) or ping(1)) can be used as condition, see examples.

    Condition Description [[ -z STRING ]] Empty string [[ -n STRING ]] Not empty string [[ STRING == STRING ]] Equal [[ STRING != STRING ]] Not Equal --- --- [[ NUM -eq NUM ]] Equal [[ NUM -ne NUM ]] Not equal [[ NUM -lt NUM ]] Less than [[ NUM -le NUM ]] Less than or equal [[ NUM -gt NUM ]] Greater than [[ NUM -ge NUM ]] Greater than or equal --- --- [[ STRING =~ STRING ]] Regexp --- --- (( NUM < NUM )) Numeric conditions Condition Description [[ -o noclobber ]] If OPTIONNAME is enabled --- --- [[ ! EXPR ]] Not [[ X ]] && [[ Y ]] And [[ X ]] || [[ Y ]] Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]] Exists [[ -r FILE ]] Readable [[ -h FILE ]] Symlink [[ -d FILE ]] Directory [[ -w FILE ]] Writable [[ -s FILE ]] Size is > 0 bytes [[ -f FILE ]] File [[ -x FILE ]] Executable --- --- [[ FILE1 -nt FILE2 ]] 1 is more recent than 2 [[ FILE1 -ot FILE2 ]] 2 is more recent than 1 [[ FILE1 -ef FILE2 ]] Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"
    # String\nif [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n
    # Combinations\nif [[ X ]] && [[ Y ]]; then\n  ...\nfi\n
    # Equal\nif [[ \"$A\" == \"$B\" ]]\n
    # Regex\nif [[ \"A\" =~ . ]]\n
    if (( $a < $b )); then\n   echo \"$a is smaller than $b\"\nfi\n
    if [[ -e \"file.txt\" ]]; then\n  echo \"file exists\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"
    Fruits=('Apple' 'Banana' 'Orange')\n
    Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"
    echo ${Fruits[0]}           # Element #0\necho ${Fruits[@]}           # All elements, space-separated\necho ${#Fruits[@]}          # Number of elements\necho ${#Fruits}             # String length of the 1st element\necho ${#Fruits[3]}          # String length of the Nth element\necho ${Fruits[@]:3:2}       # Range (from position 3, length 2)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"
    Fruits=(\"${Fruits[@]}\" \"Watermelon\")    # Push\nFruits+=('Watermelon')                  # Also Push\nFruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match\nunset Fruits[2]                         # Remove one item\nFruits=(\"${Fruits[@]}\")                 # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`)                 # Read from file\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"
    for i in \"${arrayName[@]}\"; do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"
    declare -A sounds\n
    sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n

    Declares sound as a Dictionary object (aka associative array).

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-dictionaries","title":"Working with dictionaries","text":"
    echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]}   # All values\necho ${!sounds[@]}  # All keys\necho ${#sounds[@]}  # Number of elements\nunset sounds[dog]   # Delete dog\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"
    for val in \"${sounds[@]}\"; do\n  echo $val\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"
    for key in \"${!sounds[@]}\"; do\n  echo $key\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"
    set -o noclobber  # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit    # Used to exit upon error, avoiding cascading errors\nset -o pipefail   # Unveils hidden failures\nset -o nounset    # Exposes unset variables\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"
    shopt -s nullglob    # Non-matching globs are removed  ('*.foo' => '')\nshopt -s failglob    # Non-matching globs throw errors\nshopt -s nocaseglob  # Case insensitive globs\nshopt -s dotglob     # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar    # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n

    Set GLOBIGNORE as a colon-separated list of patterns to be removed from glob matches.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#history","title":"History","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#commands","title":"Commands","text":"

    | history | Show history | | shopt -s histverify | Don't execute expanded result immediately |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#expansions","title":"Expansions","text":"

    | !$ | Expand last parameter of most recent command | | !* | Expand all parameters of most recent command | | !-n | Expand nth most recent command | | !n | Expand nth command in history | | !<command> | Expand most recent invocation of command <command> |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#operations_1","title":"Operations","text":"

    | !! | Execute last command again | | !!:s/<FROM>/<TO>/ | Replace first occurrence of <FROM> to <TO> in most recent command | | !!:gs/<FROM>/<TO>/ | Replace all occurrences of <FROM> to <TO> in most recent command | | !$:t | Expand only basename from last parameter of most recent command | | !$:h | Expand only directory from last parameter of most recent command |

    !! and !$ can be replaced with any valid expansion.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#slices","title":"Slices","text":"

    | !!:n | Expand only nth token from most recent command (command is 0; first argument is 1) | | !^ | Expand first argument from most recent command | | !$ | Expand last token from most recent command | | !!:n-m | Expand range of tokens from most recent command | | !!:n-$ | Expand nth token to last from most recent command |

    !! can be replaced with any valid expansion i.e. !cat, !-2, !42, etc.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#miscellaneous","title":"Miscellaneous","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#numeric-calculations","title":"Numeric calculations","text":"
    $((a + 200))      # Add 200 to $a\n
    $((RANDOM%=200))  # Random number 0..200\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"
    (cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"
    python hello.py > output.txt   # stdout to (file)\npython hello.py >> output.txt  # stdout to (file), append\npython hello.py 2> error.log   # stderr to (file)\npython hello.py 2>&1           # stderr to stdout\npython hello.py 2>/dev/null    # stderr to (null)\npython hello.py &>/dev/null    # stdout and stderr to (null)\n
    python hello.py < foo.txt      # feed foo.txt to stdin for python\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"
    command -V cd\n#=> \"cd is a function/alias/whatever\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"
    trap 'echo Error at about $LINENO' ERR\n

    or

    traperr() {\n  echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"
    case \"$1\" in\n  start | up)\n    vagrant up\n    ;;\n\n  *)\n    echo \"Usage: $0 {start|stop|ssh}\"\n    ;;\nesac\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"
    source \"${0%/*}/../share/foo.sh\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"
    printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"
    DIR=\"${0%/*}\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"
    while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n  -V | --version )\n    echo $version\n    exit\n    ;;\n  -s | --string )\n    shift; string=$1\n    ;;\n  -f | --flag )\n    flag=1\n    ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"
    cat <<END\nhello world\nEND\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"
    echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
    read -n 1 ans    # Just one character\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"

    | $? | Exit status of last task | | $! | PID of last background task | | $$ | PID of shell | | $0 | Filename of the shell script |

    See Special parameters.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"
    pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"
    if ping -c 1 google.com; then\n  echo \"It appears you have a working internet connection\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"
    if grep -q 'foo' ~/.bash_history; then\n  echo \"You appear to have typed 'foo' in the past\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"

    {: .-one-column}

    • Bash-hackers wiki (bash-hackers.org)
    • Shell vars (bash-hackers.org)
    • Learn bash in y minutes (learnxinyminutes.com)
    • Bash Guide (mywiki.wooledge.org)
    • ShellCheck (shellcheck.net)
    ","tags":["Featured"]},{"location":"cheatsheets/docker/","title":"Docker scripting cheatsheets","text":""},{"location":"cheatsheets/docker/#common-docker-commands","title":"Common Docker commands","text":""},{"location":"cheatsheets/docker/#update-all-images","title":"update all images","text":"
    docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
    "},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"
    docker rm `docker ps -a -q -f \"status=exited\"`\n
    "},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"
    docker rmi `docker images -q --filter \"dangling=true\"`\n
    "},{"location":"cheatsheets/macos/","title":"Macos","text":"

    Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.

    At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.

    To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac

    To get a shell to the LinuxKit docker-desktop, run the docker command

    docker run -it --rm --privileged --pid=host justincormack/nsenter1\n

    more info: https://github.com/justincormack/nsenter1

    "},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":"
    • restrict access to applications using authentication label
    "},{"location":"common/acl/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.
    "},{"location":"common/acl/#update-applistjson-file","title":"Update applist.json file","text":"

    To restrict access to applications using authentication label, you need to define an acl entry in the application dictionary object.

        \"acl\": { \"permit\": [ \"tag\" ] },\n

    For example using the application xedit

    all is a special label for everything. The xedit application can be run for all tags.

    {\n    \"acl\": { \"permit\": [ \"all\" ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.

    "},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"

    You can read the chapter authentification-rules to define some autenticated labels.

    Update the od.config file, to add a label mylocal if the source ip address is in local network 192.168.0.0/16

    authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n   'providers': {\n     'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous',\n        'policies': { \n          'acl'   : { 'permit': [ 'all' ] }, \n            'rules' : \n                { 'rule-net-home': {  \n                    'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n                    'expected'   : True,\n                    'label'      : 'localnet'\n                   } \n                } \n        } \n     } \n    } \n  } \n} \n\n

    Restart the pyos service

    kubectl delete pod -l run-pyos-od -n abcdesktop\n

    When your services are restarted, launch your web browser

    Login to your abcdesktop service and choose anonymous authentication

    Check the label set during the authentication process

    Goto the menu option at the right up corner, choose Settings | User | Session

    You should read the label localnet in the Anonymous user information.

    "},{"location":"common/acl/#define-the-acl-label-to-the-application","title":"Define the acl label to the application","text":"

    You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.

    "},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"

    Create a edit.json file with the content :

    {\n    \"acl\": { \"permit\": [ \"localhost\", \"localnet\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.

    Make sure that you have installed nodejs

    To install make.js command

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

    Create icons directory

    mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n

    Run the make command

    node make.js -f xedit.json Dockerfile\n

    You should read on standard output

    myArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'all' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n

    Look at the new Dockerfile, and build the new docker image for xedit

    docker build -t xedit.d .\n

    You should read on standard output

    [+] Building 13.0s (11/11) FINISHED                                                                                                                                                                     \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 2.01kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB                                                                                                     0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB                                                                                                     0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                               8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                       0.4s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                               0.3s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                               0.3s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                    0.0s \n => exporting to image                                                                                                                                                                             0.3s \n => => exporting layers                                                                                                                                                                            0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d  \n

    Then look at the acl label

    docker inspect xedit.d | grep oc.acl\n
                    \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n

    The acl is stringified json object.

    "},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"

    The xedit application is listed only if your are connected from a local network matching the previous rules.

    Look for the application xedit, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :

    Launch the xedit application

    "},{"location":"common/acl/#run-the-application-from-another-source-ip-address-or-update-the-acl-application","title":"Run the application from another source IP address or update the acl application","text":""},{"location":"common/acl/#update-acl-of-xedit-application","title":"Update acl of xedit application","text":"

    To update the acl of xedit application, edit the edit.json file with the content, and set nowhere tag in acl array :

    {\n    \"acl\": { \"permit\": [ \"nowhere\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    Then, rebuild Dockerfile and the docker image of the xedit application

    node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
    % node make.js -f xedit.json Dockerfile\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'nowhere' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED                                                                                                                                                                      \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 4.19kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                        0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                0.0s\n => CACHED [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [6/6] WORKDIR /home/balloon                                                                                                                                                             0.0s\n => exporting to image                                                                                                                                                                             0.0s\n => => exporting layers                                                                                                                                                                            0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d       \n

    Launch your web browser, and log in to your abcdesktop service

    Check that xedit is not found and not listed.

    The new acl does not allow the xedit application to be run and show. You can now define your own rules, add set the access control list to your applications.

    "},{"location":"common/custom-wallpaper/","title":"Customize default wallpaper","text":""},{"location":"common/custom-wallpaper/#requirements","title":"Requirements","text":""},{"location":"common/custom-wallpaper/#goals","title":"Goals","text":"
    • Change the default wallpaper and use your own
    "},{"location":"common/custom-wallpaper/#change-odconfig-file","title":"Change od.config file","text":"

    To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

    • Add the new entry SET_DEFAULT_WALLPAPER to the value like welcometoabcdesktop.png. The file welcometoabcdesktop.png already exists in the /composer/wallpapers directory of your abcdesktopio/oc.user.XX.YY container image.
    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n                    } \n
    • Restart your pyos daemon, to make sure that the ENV dictionary will be use to start a new user container.
    • Login on your abcdesktop service, your should see the wallpaper file:

    "},{"location":"common/custom-wallpaper/#update-ocuser-image-to-add-your-own-wallpaper","title":"Update oc.user image to add your own wallpaper","text":""},{"location":"common/custom-wallpaper/#find-a-new-wallpaper-image","title":"Find a new wallpaper image","text":"
    • Download a new wallpaper image, for example I choose the file on unsplash.com web site wallpaper unsplash from Silas Baisch
    • Rename the downloaded file as silas-baisch-unsplash.jpg
    "},{"location":"common/custom-wallpaper/#create-a-new-ocuser-image","title":"Create a new oc.user image","text":"
    • Create a Dockerfile to copy the new wallpaper file in /composer/wallpapers directory

    Not For a development environment, add the TAG dev

    FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n
    • Build the new docker image

    To build the new docker image, run the command line

    docker build -t abcdesktopio/oc.user.18.04 .\n

    You should read on the standard output :

    Sending build context to Docker daemon  3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
    "},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"

    To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

    • Add the new entry SET_DEFAULT_WALLPAPER to the value like silas-baisch-unsplash.jpg. The file silas-baisch-unsplash.jpg exists in the /composer/wallpapers directory of your new abcdesktopio/oc.user.18.04 container image.
    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n                    } \n
    • Restart your pyos daemon, to make sure that the ENV dictionary will be use to start a new user container.
    • Login on your abcdesktop service, your should see the wallpaper :

    "},{"location":"common/debug_application/","title":"How to debug containerised application","text":""},{"location":"common/debug_application/#requirements","title":"Requirements","text":"
    • abcdesktop ready to run
    • docker or ctr package should be install on your Linux (optional)
    "},{"location":"common/debug_application/#goals","title":"Goals","text":"
    • Read log from web interface
    • Read log from daemon interface (optionnal)
    • Read stdout and stderr, dump all environment variables, and entrypoint log, to troubleshoot application error and get quick informations
    "},{"location":"common/debug_application/#read-log-from-web-interface","title":"Read log from web interface","text":"

    Start an containerised application, I choose 2048 application, for example.

    Using the web browser, choose Settings in the menu.

    Choose Tasks to list all running containers

    Choose Logs to read the stdout log file of an application

    This application write on stdout

    Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
    "},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"

    You will read the sample stdout line, using a docker logs command, open a shell on you host.

    In a shell on your host, look for the container id of the 2048 containerised application

    $ docker ps -a|grep 2048\n01579054a1f6   abcdesktopio/ubuntu-2048.d:3.0   \"/composer/appli-doc\u2026\"   21 minutes ago     Up 21 minutes                                                                   anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n

    Read the log file form the docker logs command

    $ docker logs 01579054a1f6\n

    You should read on output the same lines written on the web interface

    Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
    "},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr and stdout","text":"

    The main log files are lastcmd.log lastcmdenv.log and $APPBIN.log:

    • /tmp/lastcmd.log : contains the stdout file of the init script command /composer/appli-docker-entrypoint.sh for latest running application
    • /tmp/lastcmdenv.log: contains the dump of all environment variables for latest running application
    • /tmp/$APPBIN.log: contains stderr and stdout of the application $APPBIN. $APPBIN should be replace by the name of your binary application filename.

    By default, with all abcdesktop templates, applications redirect stderr to stdout and pipe to a tee.

    ${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n

    By default, the /tmp volume is shared with all containers. So to debug and read log applications, you can run a webshell to have an access to stdout and stderr content.

    The var $BASENAME_APP is the name of your application

    BASENAME_APP=$(basename \"$APPBIN\")\n

    and APPBIN is path to the binary

    Example with the 2048-qt application

    APPBIN=/usr/games/2048-qt\n

    The /tmp directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp directory

    balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root    root     260 Dec  1 09:58 .\ndrwxr-xr-x 1 root    root    4096 Dec  1 09:55 ..\n-rw-r--r-- 1 balloon balloon  102 Dec  1 09:58 2048-qt.log\nsrwxrwxrwx 1 root    root       0 Dec  1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon    0 Dec  1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec  1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon  437 Dec  1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon   60 Dec  1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon    0 Dec  1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon   40 Dec  1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon   11 Dec  1 09:55 .X0-lock\ndrwxrwxrwt 2 root    root      60 Dec  1 09:55 .X11-unix\nsrw------- 1 balloon balloon    0 Dec  1 09:55 .x11vnc\nballoon:~$\n

    The files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/2048-qt.log.

    • /tmp/lastcmd.log the init command log file created by /composer/appli-docker-entrypoint.sh
    • /tmp/lastcmdenv.log the last environment variables file
    • /tmp/2048-qt.log the command log file for the application

    Dump the /tmp/2048-qt.log, with a cat command cat /tmp/2048-qt.log. Replace /tmp/2048-qt.log by your own application (binary) if you choose another application.

    You can run all bash commands inside the webshell.

    balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n

    Dump the /composer/appli-docker-entrypoint.sh result in /tmp/lastcmd.log, with a cat command cat /tmp/lastcmd.log.

    balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n

    Dump all environment variables in file /tmp/lastcmdenv.log.

    balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n

    We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.

    In next chapter we will start an application from a fresh ubuntu image, to get more details.

    "},{"location":"common/disable-firefox-connections/","title":"How to disable Mozilla Firefox automatic connections at startup","text":""},{"location":"common/disable-firefox-connections/#usage-of-policiesjson","title":"Usage of policies.json","text":"

    You can specifiy firefox policies in a file called policies.json, you may have to create it as it is noy present by default.

    Path to policies.json depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\distribution\\policies.json Linux : /usr/lib/firefox/distribution/policies.json MacOS : /Applications/Firefox.app/Contents/Resources/distribution/policies.json

    You can find all the policies templates, according to your firefox version, on the mozilla github page : https://github.com/mozilla/policy-templates/releases

    "},{"location":"common/disable-firefox-connections/#usage-of-autoconfigjs-and-firefoxcfg","title":"Usage of autoconfig.js and firefox.cfg","text":"

    Some preferences cannot be set through the policies.json file, such as disable normandy, because of firefox restrictions. But we can bypass it by creating a JS file called autoconfig.js and a config file called firefox.cfg.

    autoconfig.js is used to load and execute firefox.cfg.

    "},{"location":"common/disable-firefox-connections/#autoconfigjs","title":"autoconfig.js","text":"
    // Setup config file\npref(\"general.config.filename\", \"firefox.cfg\");\npref(\"general.config.obscure_value\", 0);\n

    Path to autoconfig.js depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\defaults\\pref\\autoconfig.js Linux : /usr/lib/firefox/defaults/pref/autoconfig.js MacOS : /Applications/Firefox.app/Contents/Resources/defaults/pref/autoconfig.js

    The locked preferences are specified in the firefox.cfg file. Path to firefox.cfg depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\firefox.cfg Linux : /usr/lib/firefox/firefox.cfg MacOS : /Applications/Firefox.app/Contents/Resources/firefox.cfg

    "},{"location":"common/disable-firefox-connections/#usage-of-proxypac-file","title":"Usage of proxy.pac file","text":"

    Despite all the efforts to disable automatic connections via policies.json and firefox.cfg files, there where still a few connections that seems to be not possible to disable. To bypass this phenomena, we will create a file named proxy.pac that will block access to the remaining URLs by redirecting them to an unreachable proxy.

    Save proxy.pac on your machine and keep in mind the path to your file.

    Once done, you should add the following line to the Proxy policy inside your policies.json file : \"AutoConfigURL\": \"file:///path/to/your/proxy.pac\"

    "},{"location":"common/disable-firefox-connections/#disable-startup-connections","title":"Disable startup connections","text":""},{"location":"common/disable-firefox-connections/#policiesjson","title":"policies.json","text":"URL Parameter(s) to set https://location.services.mozilla.com \"browser.region.network.url\": \"\" https://contile.services.mozilla.comhttps://tiles-cdn.prod.ads.prod.webservices.mozgcp.net \"browser.topsites.contile.enabled\": false\"browser.topsites.contile.endpoint\": \"\" https://spocs.getpocket.com \"browser.newtabpage.activity-stream.discoverystream.enabled\": false https://push.services.mozilla.com \"dom.push.connection.enabled\": false https://accounts.firefox.com \"browser.startup.homepage_override.mstone\": \"ignore\"(also disable news page) https://shavar.services.mozilla.com \"browser.safebrowsing.provider.mozilla.gethashURL\": \"\"\"browser.safebrowsing.provider.mozilla.updateURL\": \"\" https://tracking-protection.cdn.mozilla.net \"browser.safebrowsing.downloads.remote.enabled\": false http://detectportal.firefox.com \"network.captive-portal-service.enabled\": false\"network.connectivity-service.enabled\": false https://incoming.telemetry.mozilla.orghttps://www.mozilla.org Set \"DisableTelemetry\" policy to true"},{"location":"common/disable-firefox-connections/#firefoxcfg","title":"firefox.cfg","text":"URL Parameter(s) to set https://normandy.cdn.mozilla.nethttps://classify-client.services.mozilla.com lockPref(\"app.normandy.enabled\", false)lockPref(\"app.normandy.api_url\", \"\")"},{"location":"common/disable-firefox-connections/#example-of-policiesjson-file","title":"Example of policies.json file","text":"
    \"policies\": {\n    \"DisableTelemetry\": true,\n    \"Preferences\": {\n        \"browser.region.network.url\": \"\",\n        \"browser.topsites.contile.endpoint\": \"\",\n        \"browser.newtabpage.activity-stream.discoverystream.enabled\": false,\n        \"browser.startup.homepage_override.mstone\": \"ignore\",\n        \"browser.safebrowsing.provider.mozilla.gethashURL\": \"\",\n        \"browser.safebrowsing.provider.mozilla.updateURL\": \"\",\n        \"browser.safebrowsing.downloads.remote.enabled\": false,\n        \"dom.push.connection.enabled\": false,\n        \"network.captive-portal-service.enabled\": false,\n        \"network.connectivity-service.enabled\": false\n    },\n    \"Proxy\": {\n        \"Mode\": \"autoConfig\",\n        \"AutoConfigURL\": \"file:///path/to/your/proxy.pac\"\n    }\n}\n
    "},{"location":"common/disable-firefox-connections/#example-of-firefoxcfg-file","title":"Example of firefox.cfg file","text":"
    // Disable Normandy service\nlockPref(\"app.normandy.enabled\", false);\nlockPref(\"app.normandy.api_url\", \"\");\n
    "},{"location":"common/disable-firefox-connections/#example-of-proxypac-file","title":"Example of proxy.pac file","text":"
    // File PAC\n//\nfunction FindProxyForURL(url, host)\n{\n  // just define hostname and unreachable port\n  var var_blackhole = \"127.0.0.1:12345\"; // could be any other UNUSED port than 12345\n\n  //URL deny definition - Blackhole for blocked URL\n\n  if ( host == \"firefox.settings.services.mozilla.com\"\n    || host == \"content-signature-2.cdn.mozilla.net\"\n    || host == \"firefox-settings-attachments.cdn.mozilla.net\"\n  ) {\n    return \"PROXY \" + var_blackhole;\n  }\n\n  return  \"DIRECT; \";\n}\n
    "},{"location":"common/disable-firefox-connections/#sources","title":"Sources","text":"
    • How to stop Firefox from making automatic connections
    • nikitastupin/stop-firefox-automatic-connections
    • Silencing Firefox's Chattiness for Web App Testing
    • Customizing Firefox Using AutoConfig
    • Firefox Reddit
    • Mozilla support forums
    "},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"
    1. Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation button.

    2. Choose Add as a response to the question Add abcdesktop Clipboad Helper ?

    3. Press OKay, Got it to confirm the abcdesktop Clipboad helper insallation

    "},{"location":"common/firefox-extension/#use-fully-qualified-domain-name-filter","title":"Use fully qualified domain name filter","text":"

    Firefox clipboard extension runs ONLY if the hostname contains desktop string.

    The URL must matches *://*desktop*/*\" to run the clipboard extension.

    • https://demo.abcdesktop.io matches, the firefox clipboard extension is running.
    • https://desktop.domain.io matches, the firefox clipboard extension is running.
    • https://abcdesktop.mydomain.local matches, the firefox clipboard extension is running.
    • https://demo.domain.com does not match, the firefox clipboard extension is not running.
    "},{"location":"common/firefox-extension/#run-firefox-clipboard-extension-for-abcdesktop","title":"Run firefox clipboard extension for abcdesktop","text":"

    Firefox clipboard extension syncs only text data, binary data like images are not yet supported.

    • Firefox clipboard extension syncs your clipboard data selected from your abcdesktop desktop to your local desktop environment.

    • Firefox clipboard extension syncs your local desktop environment clipboard to your abcdesktop desktop clipboard.

    "},{"location":"common/flash-firefox-esr/","title":"How to build and run abcdesktop firefox-esr image to run flash application","text":"

    Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.

    Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.

    Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.

    Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.

    "},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":"
    • use Flash Player for own web site
    "},{"location":"common/flash-firefox-esr/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • Nodejs installed on your host.
    "},{"location":"common/flash-firefox-esr/#edit-the-mmscfg-file","title":"Edit the mms.cfg file","text":"

    Edit the mms.cfg file, and add your own website url

    EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n

    Add the a new line and replace https://www.domain.comby your own web site

    AllowListURLPattern=https://www.domain.com\n
    "},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"

    Create a Dockerfile firefox-esr.d

    • to copy your new mms.cfg into the directory /etc/adobe of your container image
    FROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
    "},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"

    Run the docker build command

    docker build -t firefox-esr.d -f firefox-esr.d .\n
    "},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Using you web browser, log in to your abcdesktop service

    Look at the twice firefox icon for Firefox and Firefox-esr application.

    Start the application Firefox-esr

    Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site

    Click to the Run Adobe Flash plugins

    And Allow the Adobe Flash to run

    Great, you can run the Adobe Flash plugins.

    "},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and build Citrix Receiver for abcdesktop","text":"

    Citrix Workspace App or Citrix Receiver does not exist in official debian repository. You need to download the deb package from the www.citrix.com website manually.

    • Clone the abcdesktopio/oc.apps repository
    git clone https://github.com/abcdesktopio/oc.apps.git\n
    • Download the Citrix Receiver for Linux .deb package. Go to https://www.citrix.com/downloads/citrix-receiver/linux/receiver-for-linux-latest.html

    • Copy the downloaded file icaclient_13.10.0.20_amd64.deb for example as icaclient_amd64.deb to your local oc.apps directory

    cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
    • Run docker build command
    docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
    Sending build context to Docker daemon  29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
    • The new ica citrix docker image abcdesktopio/citrix.d:dev is ready to run
    "},{"location":"common/shm/","title":"IPC and pod","text":"

    Does a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?

    Let's have a look !

    There are two ways to use shared memory in Linux: System V and POSIX.

    • shmget / shmat / shmdt for the System V method.
    • shm_open / mmap / shm_unlink for the POSIX method.
    "},{"location":"common/shm/#requirements","title":"Requirements","text":"
    • kubectl command-line tool must be configured to communicate with your cluster.
    "},{"location":"common/shm/#install-the-bash-and-yaml-files","title":"Install the bash and yaml files","text":"

    To install the bash and yaml files, run the command

    git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
    "},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"

    Goal: Test System V shared memory between two containers inside the same pod

    This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.

    The test is successful if there is no system error and the strings are equals.

    The string MemContents stored in the shared memory is : This is the way the world ends...

    • The sender container writes a string from stdin into shared memory. The source code is here
        int exit_code = -1;\n    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    strcpy( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n
    • The receiver container print the sender's shared memory string to stdout. The source code is here
        // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    printf(\"%s\\n\",str);\n    cmp_code = strcmp( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n

    To run the System V tests

    "},{"location":"common/shm/#run-a-shared-memory-test-access-using-a-shared-path","title":"Run a shared memory test access using a shared path","text":"

    In this yaml file, sender and receiver containers share a file. This file is /shared/me and it is the first parameter to ftok system V call.

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n    - name: receiver\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n

    The env var FTOK_PATH set the first parameter to ftok system V call.

    Run the test

    # this test result is success\n./runtest.sh podsendershared_success.yaml\n

    You can read the same string from sender to receive container.

    This test is OK.

    pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
    "},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"

    In this yaml file, sender and receiver do not share file. /dummy filename is the first parameter to ftok system V call.

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n    - name: receiver\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n

    The env var FTOK_PATH set the first parameter to ftok system V call.

    Run the test

    # this test result is failed\n./runtest.sh podsendershared_failed.yaml\n

    You can read that the sender write a string. The receiver does not read this string.

    This test is KO.

    pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n

    The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers

    "},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"

    Goal: Test Posix shared memory between two containers inside the same pod

    The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin

    This test creates two containers a sender and a receiver to read a shared memory in /dev/shm, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.

    The string MemContents stored in the shared memory is : This is the way the world ends...

    • The sender container writes a string into shared memory map file /shMemEx
      int fd = shm_open(BackingFile,      /* name from smem.h */\n                    O_RDWR | O_CREAT, /* read/write, create if needed */\n                    AccessPerms);     /* access permissions (0644) */\n  if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n  ftruncate(fd, ByteSize); /* get the bytes */\n\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1  == memptr) report_and_exit(\"Can't get segment...\");\n\n  fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n  fprintf(stderr, \"backing file:       /dev/shm%s\\n\", BackingFile );\n\n  /* semahore code to lock the shared mem */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n  /* increment the semaphore so that memreader can read */\n  if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n  sleep(12); /* give reader a chance */\n\n  /* clean up */\n  munmap(memptr, ByteSize); /* unmap the storage */\n  close(fd);\n  sem_close(semptr);\n  shm_unlink(BackingFile); /* unlink from the backing file */\n\n
    • The receiver container print the sender's shared memory string to stdout
      int fd = shm_open(BackingFile, O_RDWR, AccessPerms);  /* empty to begin */\n  if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n  /* get a pointer to memory */\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n  /* create a semaphore for mutual exclusion */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n  if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n    int i;\n    for (i = 0; i < strlen(MemContents); i++)\n      write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n    sem_post(semptr);\n  }\n\n  /* cleanup */\n  munmap(memptr, ByteSize);\n  close(fd);\n  sem_close(semptr);\n  unlink(BackingFile);\n

    To run the POSIX test

    kubectl create -f podposixshm.yaml \npod/podposixshm created\n

    The podposixshm pod status must be Completed

    kubectl get pods podposixshm  \nNAME          READY   STATUS      RESTARTS   AGE\npodposixshm   0/2     Completed   0          27s\n

    The podposixshm sender log file should be :

    kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file:       /dev/shm/shMemEx\n

    The pod/podposixshm receiver log file should be :

    kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n

    Delete the podposixshm pod

    kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
    "},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"

    On a pod, we can see that the default size of /dev/shm is 64MB, when running the df /dev/shm command.

    kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
    df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

    A dd command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.

    Run the dd command

    dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n

    Run the df /dev/shm command

    df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

    Delete the shmtest pod

    kubectl delete pods shmtest\npod \"shmtest\" deleted\n

    The default size is 64 MB.

    "},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"

    Create a updateshm.yaml file with the yaml content

    apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm\n  name: updateshm\nspec:\n  volumes:                          \n    - name: volumeshm\n      emptyDir:\n        medium: Memory\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: volumeshm\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n

    Create the new pod updateshm

    kubectl apply -f updateshm.yaml \npod/updateshm created\n

    Execute a df /dev/shm command inside this pods to read the size of /dev/shm

    kubectl exec updateshm -- df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\ntmpfs                 16176264         0  16176264   0% /dev/shm\n

    The size of /dev/shm is 16176264 of 1K blocks. The new default size is 16 GB.

    To set a fixed limit use the sizeLimit in the spec.volumes

    apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm512\n  name: updateshm512\nspec:\n  volumes:                          \n    - name: updateshm512\n      emptyDir:\n        medium: Memory\n        sizeLimit: 512Mi\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: updateshm512\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n
    "},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":"
    • Upload file from your local storage to your abcdesktop
    • Download file from your abcdesktop to your local storage
    "},{"location":"common/upload_and_download_files/#upload-file-in-your-desktop","title":"Upload file in your desktop","text":"

    To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop

    Then, start the filemanager, your new file is located in your home directory

    "},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"

    To download file from your abcdesktop to you local storage, just start the file manager.

    Choose your file and using the right mouse button, choose the menu option Download for Desktop as describe :

    The file is downloaded by your web browser

    The file is located in your Downloads directory

    Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.

    "},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"

    The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine

    "},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"

    To get the installation script and the vagrant file, run the command

    git clone https://github.com/abcdesktopio/vagrant.git\n
    • The vagrant file name is Vagrantfile.kubernetes.bastion
    • The installation script is abcdesktop_kubernetes_bastion.sh
    "},{"location":"common/1.0/abcdesktop.bastion/#start-vagrant-file-to-run-the-kmaster-vm","title":"start vagrant file to run the kmaster vm","text":"

    Run the command to run the vagrant file

    $ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n

    This vagrant file defines a vm kmaster :

    kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n  v.name = \"kmaster\"\n  v.memory = 4096\n  v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n

    It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )

    All networks are defined as private_network to make it simplest as possible.

    "},{"location":"common/1.0/abcdesktop.bastion/#abcdesktop_kubernetes_bastionsh-description","title":"abcdesktop_kubernetes_bastion.sh description","text":"

    abcdesktop_kubernetes_bastion.sh takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64 :

    • kubernetes
    • abcdesktop
    • multus-cni
    • multi-networkpolicy

    Read step by step the abcdesktop_kubernetes_bastion.sh content to get more details.

    You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file

    "},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into the kmaster vm","text":"
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n

    List kube-system pods and abcdesktop pods

    To run kubectl commands inside the master virtual machine

    export KUBECONFIG=/etc/kubernetes/admin.conf \n
    vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME                              READY   STATUS    RESTARTS   AGE\ncoredns-64897985d-4d57p           1/1     Running   0          11h\ncoredns-64897985d-qtmkq           1/1     Running   0          11h\netcd-kmaster                      1/1     Running   0          11h\nkube-apiserver-kmaster            1/1     Running   0          11h\nkube-controller-manager-kmaster   1/1     Running   0          11h\nkube-flannel-ds-gskrs             1/1     Running   0          11h\nkube-proxy-c566l                  1/1     Running   0          11h\nkube-scheduler-kmaster            1/1     Running   0          11h\n
    vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-pt2j6           1/1     Running   0          11h\ndaemonset-pyos-zqpf7            1/1     Running   0          11h\nmemcached-od-78578c879-kstcl    1/1     Running   0          11h\nmongodb-od-5c68794bb8-wf6sm     1/1     Running   0          11h\nopenldap-od-558f7959d5-vhbln    1/1     Running   0          11h\nspeedtest-od-7b66cc656b-fh97g   1/1     Running   0          11h\n
    "},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your web browser to

    http://[your-ip-hostname]:30443/\n

    Replace [your-ip-hostname] by the host node IP address

    You should get the web page

    "},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"

    abcdesktop adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server

    Login Accounts Login Password Hubert J. Farnsworth professor Philip J. Fry fry Hermes Conrad hermes Turanga Leela leela Bender Bending Rodr\u00edguez bende

    Use the credentials, to login

    • Login Account: Philip J. Fry
    • Login Password: fry

    "},{"location":"common/1.0/abcdesktop.bastion/#get-the-default-desktop","title":"Get the default desktop","text":"

    After the login, you should get the default desktop.

    "},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"

    To start a shell, insert webshell as keywords in the search text area :

    "},{"location":"common/1.0/abcdesktop.bastion/#run-ifconfig-command-to-list-network-interfaces","title":"Run ifconfig command to list network interfaces","text":"

    In the web shell, run the command

    $ ifconfig -a\n

    This command shows the network interfaces net1 and net2 with the associated ip address

    "},{"location":"common/1.0/abcdesktop.bastion/#tag-and-rules","title":"Tag and rules","text":"
    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    "},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml","text":"

    Open the abcdesktop.yaml configuration file, and look at ldapconfig

        ldapconfig : { 'planet': {  'default'       : True,\n                                'ldap_timeout'  : 15,\n                                'ldap_protocol' : 'ldap',\n                                'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                                'servers'       : [ 'openldap.abcdesktop.svc.cluster.local' ],\n                                'secure'        : False,\n                                'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n                                'policies': {\n                                    'acls': None,\n                                    'rules' : {\n                                        'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ], 'expected' : True, 'label': 'shipcrew'   },\n                                        'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
    • openldap.abcdesktop.svc.cluster.local is a local ldap server running as a pod
    "},{"location":"common/1.0/abcdesktop.bastion/#rules-description","title":"Rules description","text":"
    • 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' } If a user is member of 'cn=ship_crew,ou=people,dc=planetexpress,dc=com' then the label tag shipcrew is set to the user's pod

    • 'rule-admin': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' } If a user is member of 'cn=admin_staff,ou=people,dc=planetexpress,dc=com' then the label tag adminstaff is set to the user's pod

    In the abcdesktop.yaml configuration file, and look at the desktop.policies and the network option

     desktop.policies: {\n        'rules': {\n            'network': {\n                'shipcrew': {\n                    'annotations' : {\n                        'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n                    }\n                }\n            }\n        },\n        'acls' : {} }\n

    If a pod as the 'shipcrew' tag, then add the network annotations

    [ \n    {   \"name\": \"macvlan-conf-eth3\"}, \n    {   \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
    "},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop namespace","text":"

    To list pod in the abcdesktop namespace, run the command

    export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
    root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME                                       READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-5dzjc                      1/1     Running   0          151m\ndaemonset-pyos-szs8h                       1/1     Running   0          151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308   3/3     Running   0          86m\nmemcached-od-78578c879-vx26h               1/1     Running   0          151m\nmongodb-od-6568f85897-tgfjb                1/1     Running   0          151m\nopenldap-od-558f7959d5-qz2kg               1/1     Running   0          151m\nspeedtest-od-76d578578d-rl8k8              1/1     Running   0          151m\n
    "},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"

    Run the command

    kubectl describe pods YOUR_POD\n

    Replace YOUR_POD by your pod

    root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName:         fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace:    abcdesktop\nPriority:     0\nNode:         kmaster/10.0.2.15\nStart Time:   Mon, 31 Jan 2022 16:14:16 +0000\nLabels:       access_provider=planet\n              access_userid=FRY\n              access_username=philip_j__fry\n              broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n              domain=desktop\n              netpol/ocuser=true\n              pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n              shipcrew=true\n              type=x11server\n              xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n

    The label shipcrew=true is set

    Annotations:  k8s.v1.cni.cncf.io/network-status:\n                [{\n                    \"name\": \"cbr0\",\n                    \"interface\": \"eth0\",\n                    \"ips\": [\n                        \"10.244.0.12\"\n                    ],\n                    \"mac\": \"06:17:a7:0c:24:9b\",\n                    \"default\": true,\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth3\",\n                    \"interface\": \"net1\",\n                    \"ips\": [\n                        \"192.168.29.12\"\n                    ],\n                    \"mac\": \"3a:db:a1:33:53:72\",\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth2\",\n                    \"interface\": \"net2\",\n                    \"ips\": [\n                        \"10.9.1.12\"\n                    ],\n                    \"mac\": \"86:eb:43:fe:db:e7\",\n                    \"dns\": {}\n                }]\n

    The Annotations k8s.v1.cni.cncf.io/network-status describes the network interfaces inside the pod.

    "},{"location":"common/1.0/abcdesktop.bastion/#look-at-the-pre-installed-network-rules","title":"Look at the pre installed network rules","text":"

    Run the command

    kubectl get net-attach-def -n abcdesktop\n
    root@kmaster:~#  kubectl get net-attach-def -n abcdesktop\nNAME                AGE\nmacvlan-conf-eth2   154m\nmacvlan-conf-eth3   154m\n

    Get more details about macvlan-conf-eth3

    root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName:         macvlan-conf-eth3\nNamespace:    abcdesktop\nLabels:       <none>\nAnnotations:  <none>\nAPI Version:  k8s.cni.cncf.io/v1\nKind:         NetworkAttachmentDefinition\nMetadata:\n  Creation Timestamp:  2022-01-31T15:10:38Z\n  Generation:          1\n  Managed Fields:\n    API Version:  k8s.cni.cncf.io/v1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:metadata:\n        f:annotations:\n          .:\n          f:kubectl.kubernetes.io/last-applied-configuration:\n      f:spec:\n        .:\n        f:config:\n    Manager:         kubectl-client-side-apply\n    Operation:       Update\n    Time:            2022-01-31T15:10:38Z\n  Resource Version:  1008\n  UID:               a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n  Config:  { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents:    <none>\n

    macvlan-conf-eth3 is used by the user's pod.

    "},{"location":"common/1.0/abcdesktop.bastion/#list-multi-policy","title":"List multi-policy","text":"

    To list multi-policy, run the command

    kubectl get multi-policy -n abcdesktop\n
    root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME                  AGE\nmnp-permit-shipcrew   3h\n

    And get description about the policy mnp-permit-shipcrew

    apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n  name: mnp-permit-shipcrew\n  namespace: abcdesktop \n  annotations:\n    k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n  podSelector:\n    matchLabels:\n      shipcrew: 'true' \n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - ipBlock: \n        cidr: 192.168.55.21/32\n    - ipBlock:\n        cidr: 192.168.55.22/32\n    ports:\n      - protocol: TCP\n        port: 22\n

    If a pod in the abcdesktop namespace, contains a label shipcrew: 'true' set the iptables to permit egress to host 192.168.55.21/32 and 192.168.55.22/32 using protocol TCP destination port 22.

    "},{"location":"common/1.0/abcdesktop.bastion/#dump-the-generated-by-iptables-in-varlibmulti-networkpolicyiptables","title":"dump the generated by iptables in /var/lib/multi-networkpolicy/iptables/","text":"
    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    • list the directories /var/lib/multi-networkpolicy/iptables/ in kmaster
    root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n

    A new afe82680-77b4-4bac-ad2b-8be9488402fb exists

    • cat the current.iptables file content in the /var/lib/multi-networkpolicy/iptables/ afe82680-77b4-4bac-ad2b-8be9488402fb
    root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
    "},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"

    For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.

    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    • list your docker images
    root@kmaster:~# docker images\nREPOSITORY                                                  TAG       IMAGE ID       CREATED         SIZE\nabcdesktopio/oc.pyos                                        dev       6bd8b8d33b73   19 hours ago    1.17GB\nrancher/mirrored-flannelcni-flannel                         v0.16.3   8cb5de74f107   3 days ago      59.7MB\nmemcached                                                   latest    fa6cf68061c2   5 days ago      89.1MB\nk8s.gcr.io/kube-apiserver                                   v1.23.3   f40be0088a83   6 days ago      135MB\nk8s.gcr.io/kube-controller-manager                          v1.23.3   b07520cd7ab7   6 days ago      125MB\nk8s.gcr.io/kube-scheduler                                   v1.23.3   99a3486be4f2   6 days ago      53.5MB\nk8s.gcr.io/kube-proxy                                       v1.23.3   9b7cc9982109   6 days ago      112MB\nabcdesktopio/oc.user.18.04                                  latest    52176672cf2e   7 days ago      1.79GB\nabcdesktopio/oc.user.ssh.18.04                              dev       52176672cf2e   7 days ago      1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables   latest    54838d8bbd14   10 days ago     408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin              v1.0.1    ac40ce625740   12 days ago     8.1MB\nabcdesktopio/oc.nginx                                       dev       fe71c8621ef2   12 days ago     506MB\nabcdesktopio/oc.pulseaudio.18.04                            dev       d44997a46969   2 months ago    170MB\nabcdesktopio/oc.pulseaudio.18.04                            latest    d44997a46969   2 months ago    170MB\nk8s.gcr.io/etcd                                             3.5.1-0   25f8c7f3da61   3 months ago    293MB\nghcr.io/k8snetworkplumbingwg/multus-cni                     stable    e6cafb5d5aa1   3 months ago    290MB\nk8s.gcr.io/coredns/coredns                                  v1.8.6    a4ca41631cc7   3 months ago    46.8MB\nabcdesktopio/oc.cupsd.18.04                                 dev       095105a59722   4 months ago    745MB\nabcdesktopio/oc.cupsd.18.04                                 latest    095105a59722   4 months ago    745MB\nk8s.gcr.io/pause                                            3.6       6270bb605e12   5 months ago    683kB\nrroemhild/test-openldap                                     latest    c6b1bec361ca   10 months ago   144MB\nabcdesktopio/oc.mongo                                       latest    802219537d3b   12 months ago   493MB\nabcdesktopio/oc.speedtest                                   dev       298a391cfb5b   3 years ago     355MB\n
    • Add new application images

    To add an application like Firefox, run the docker pull command :

    root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
    docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
    "},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"

    Reload or open your web browser

    http://[your-ip-hostname]:30443/\n

    Firefox is added to your desktop dock. Start Firefox application

    No rule has be defined to allow http request from your pod to a web site

    All http requests are denied

    The firefox application inherits from the pod's the network rules.

    "},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"

    If you choose to use VMware instead of VirtualBox hypervisor

    "},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about the macvlan driver :","text":"

    Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.

    "},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan driver on vSwitch VMware","text":"

    The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.

    When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.

    Set the Mac address changes option is set to Accept

    "},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":"
    • Use a dedicated network for an application. For example bind the application Firefox to a dedicated docker network. This dedicated network can use macvlan, ipvlan or an SRIOV network driver.
    "},{"location":"common/1.0/docker_macvlan/#architecture","title":"Architecture","text":"

    When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.

    "},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"

    On your worker nodes :

    • create a dedicated network interface to bridge the new network interface
    • add the label abcdesktop=true to the network object

    You have to choose a nework driver for example

    network driver macvlan ipvlan docker-sriov-plugin

    Only the name of the network is used by abcdesktop.

    Create a network with macvlan or ipvlan driver

    In these two examples :

    • Subnet is 192.168.8.0/24
    • Gateway is 192.168.8.254
    • Ip Range is 192.168.8.0/27
    "},{"location":"common/1.0/docker_macvlan/#example-with-macvlan","title":"Example with macvlan :","text":"

    Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123

    docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
    "},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan ipvlan_mode=l2 :","text":"

    Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.

    docker network create --label type=oc.app -d ipvlan  -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
    "},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan or ipvlan):","text":"

    Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :

    • ping the default gateway
    • nslookup to query www.google.com ip address
    export GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
    "},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"

    Update your applist.json file and add a specific rule into the firefox application description

    git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

    Specific rules entry example

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

    In this example, if the current user token contains the tag label internet when the firefox application use abcnetfirefox and the dns 8.8.8.8

    "},{"location":"common/1.0/docker_macvlan/#edit-the-applistjson-file","title":"Edit the applist.json file","text":"

    Edit the applist.json file, and add rules to the application firefox for example

    The new firefox dictionary with rules :

    {\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

    Save your changes, and run make dockerfile, next docker build

    Build and update your new firefox application

    # create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

    Check that the oc.rules label in new firefox.d image

    docker inspect firefox.d \n

    The oc.rules label is a string json formated

    \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
    "},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"

    Add a tag internet to the user auth provider

    "},{"location":"common/1.0/docker_macvlan/#update-authprovider-in-odconfig-file","title":"Update authprovider in od.config file","text":"

    Update the ldapconfig for planet with the new policies dict

      'policies': { 'acls': None, \n              'rules'   : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ],\n              'expected' : True, \n              'label': 'internet' },\n

    The complete ldapconfig for planet is

    ldapconfig : { 'planet': {    'default'       : True,\n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.7.69' ],\n                        'secure'        : False,\n                        'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n                        'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}',  \n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n                        'policies': { 'acls': None, \n             'rules'    : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'internet' } \n      } } } }\n

    Restart your kubernetes pyos pod, to reload new the od.config configuration file.

    "},{"location":"common/1.0/docker_macvlan/#use-the-philip-j-fry-user-context","title":"Use the Philip J. Fry user context.","text":"

    Open a web browser, go to the abcdesktop login page.

    Login Accounts

    Login Password Philip J. Fry. fry Hubert J. Farnsworth professor

    Note: the user Philip J. Fry is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Login as the Philip J. Fry user account.

    During the user login process, pyos tag the user authentification with the 'label': 'internet'

    Start the new application firefox, the docker network for this application use the abcnetfirefox

    Run the command

    docker network inspect abcnetfirefox\n

    abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\" and bind the abcnetfirefox to user container.

    [\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {\n            \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n                \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n                \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n                \"MacAddress\": \"02:42:a1:69:d0:82\",\n                \"IPv4Address\": \"192.168.8.1/24\",\n                \"IPv6Address\": \"\"\n            }\n        },\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

    Close the firefox application.

    Logoff, to remove the user pod Philip J. Fry.

    "},{"location":"common/1.0/docker_macvlan/#use-the-hubert-j-farnsworth-user-context","title":"Use the `Hubert J. Farnsworth user context.","text":"

    Login as the Hubert J. Farnsworth user account.

    Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Start the new application firefox, the docker network for this application do NOT use the abcnetfirefox

    Run the command

    docker network inspect abcnetfirefox\n

    abcnetfirefox description :

    docker network inspect abcnetfirefox\n[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

    The new firefox container doesn't use the docker network abcnetfirefox, because the Hubert J. Farnsworth user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    The network is disabled by default.

    Inspect the Hubert J. Farnsworth firefox container

            \"NetworkSettings\": {\n            \"Bridge\": \"\",\n            \"SandboxID\": \"\",\n            \"HairpinMode\": false,\n            \"LinkLocalIPv6Address\": \"\",\n            \"LinkLocalIPv6PrefixLen\": 0,\n            \"Ports\": {},\n            \"SandboxKey\": \"\",\n            \"SecondaryIPAddresses\": null,\n            \"SecondaryIPv6Addresses\": null,\n            \"EndpointID\": \"\",\n            \"Gateway\": \"\",\n            \"GlobalIPv6Address\": \"\",\n            \"GlobalIPv6PrefixLen\": 0,\n            \"IPAddress\": \"\",\n            \"IPPrefixLen\": 0,\n            \"IPv6Gateway\": \"\",\n            \"MacAddress\": \"\",\n            \"Networks\": {}\n        }\n

    The network access is disable for this application

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n

    In this case, only users with the label tag internet, can bind the network name abcnetfirefox.

    "},{"location":"common/1.0/docker_macvlan/#enable-network-for-hubert-j-farnsworth","title":"Enable network for Hubert J. Farnsworth","text":"

    Update the application firefox rules

    Now it's time to permit network access to

    Update the applist.json file :

    Specific rules entry example

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

    The new firefox dictionary with network rules set with \"default\": true :

    {\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

    Save your changes, and run make dockerfile, next docker build

    Build and update your new firefox application

    # create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

    Check that the oc.rules label in new firefox.d image

    docker inspect firefox.d \n

    The oc.rules label is a string json formated

     \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n

    Request the abcdesktop core service to update the application cache data

    Replace MY_FQDN by your own hostname

    export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n

    You do not need to logoff the Hubert J. Farnsworth, just close Firefox application and start it again. The new firefox container use the default network.

    Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com use the abcnetfirefox network.

    "},{"location":"common/1.0/docker_macvlan/#webhook-events-create-and-destroy-application","title":"Webhook events create and destroy application","text":"

    A rule support a specific bash command to notify external security equipment like firewalls, by sending create and destroy events.

    \"rules\": {  \"homedir\": { \"default\": false, \"ship\": true }, \n                \"network\": { \"default\": false, \n                    \"ship\": { \"name\": \"abcnetfirefox\", \n                                \"dns\": [ \"8.8.8.8\" ], \n                                \"webhook\": { \n                                    \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n                                    \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n                                } \n                    }\n                }\n}\n
    • When a new docker container is created, the control plane pyos execute the command
    /usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
    • When a new docker container is destoyed, the control plane pyos call the url
    /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n

    Each {{ $label }} is a mustached value.

    Label name description example container_ip container ip addr 192.168.8.130 provider authentification provider name planet providertype authentification provider type ldap userid authentification provider user id fry name username Philip J. Fry sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"

    The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'

    "},{"location":"common/1.0/docker_macvlan/#destroy-event","title":"destroy event:","text":"

    The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'

    "},{"location":"common/1.0/docker_macvlan/#desktopwebhook-options-in-odconfig-file","title":"desktop.webhook options in od.config file","text":""},{"location":"common/1.0/docker_macvlan/#url-encoding-parameters","title":"url encoding parameters","text":"

    To encode url parameters use the option desktop.webhookencodeparams. Set desktop.webhookencodeparams to True to encode label name. The default value is False

    "},{"location":"common/1.0/docker_macvlan/#additional-dict-datas","title":"additional dict datas","text":"

    Additional datas can be set using the desktop.webhookdict option in od.config file

    desktop.webhookdict: { \n        'api_key': 'supersecret', \n        'firewall_manage_ip': '161.105.208.129'  \n}\n

    The command line

    /usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n

    becomes

    /usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
    "},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop.io images to use your own.
    "},{"location":"common/1.0/update_frontend_image/#build-images","title":"Build images","text":"

    Build image process from abcdesktopio docker registry to your private registry

    "},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"

    Goal :

    • Custom web site colors
    • Change logo
    • Rename the web site name

    Only the name of the network is used by abcdesktop.

    "},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
    git clone https://github.com/abcdesktopio/webModules.git\n
    "},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

    Update your ui.json file. ui.json is located in var/webModules/transpile/config directory.

    # cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x   1 root root   4096 Feb  1 15:14 .\ndrwxr-xr-x   1 root root   4096 Feb  1 15:14 ..\n-rw-rw-r--   1 root root     34 Feb  1 15:14 .cache.json\n-rw-rw-r--   1 root root   2215 Feb  1 15:11 modules.json\n-rw-rw-r--   1 root root   1044 Feb  1 15:11 ui.json\n

    ui.json is a json dictionary file

    The main entry is name, name is the project name:

    entry default value example name abcdesktop.io acmedesktop.io
    {\n  \"name\": \"abcdesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
    "},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name to

    \"name\": \"acmedesktop.io\"\n

    and the

    @tertiary \"value\": \"#00BCD4\"\n

    Example

    {\n  \"name\": \"acmedesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#00FCD4\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
    "},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"
    FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
    "},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"

    Run the docker build command to build the new oc.nginx:acme image

    docker build -t oc.nginx:acme .\n
    Sending build context to Docker daemon  258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n

    Run the docker images command to read the new oc.nginx image

    docker images \n\nREPOSITORY                   TAG       IMAGE ID       CREATED             SIZE\noc.nginx                     acme      4de1755b60d7   About an hour ago   746MB\n
    "},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"

    Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx by the new image oc.nginx:acme name.

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'oc.nginx:acme'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n

    The run the docker-compose up, and start you web browser. You can read the new project name at the home page.

    We define the new tertiary color as #00FCD4 in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }

    Old tertiary color has been replace by #00FCD4.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":"
    • envsubst command preinstalled. Common Linux systems have envsubst preinstalled
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#goals","title":"Goals","text":"
    • Create a new containerised application from scratch using pod volume mapping
    • Start a pod and get a shell inside container as user root. Run xedit application as root
    • Start a pod and get a shell inside container as user hermes. Run xedit application as hermes
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-an-application-using-a-new-container","title":"Create an application using a new container","text":"

    We are starting a new containerised application from a fresh ubuntu:20.04 image and bind the X11 socket to use the pod DISPLAY.

    We start a new container one as root, and another one as current user hermes

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-abcdesktop-session","title":"Start a new abcdesktop session","text":"

    Open a web browser and go to abcdesktop service url

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"

    In the example we use LDAP authentification.

    The login is Hermes Conrad, the password is hermes

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-hermess-pod-variables-name-uid-xauth_key","title":"Get hermes's pod variables: name, uid, XAUTH_KEY","text":"

    Get a shell to your host. All next command use a host shell.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's pod name","text":"

    To read the hermes pod name, MIT-MAGIC-COOKIE-1, and uid

    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n

    We save this value in the pod variable, for next usage

    POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n

    You should read on stdout

    hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n

    We save this value in the $POD for a next usage.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-xauth_key","title":"Get the hermes's XAUTH_KEY","text":"

    The release 3.0 need the MIT-MAGIC-COOKIE-1 to reach the x11 DISPLAY.

    Run the command echo $XAUTH_KEY to read the $XAUTH_KEY value inside the hermes's pod

    export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
    Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n

    The XAUTH_KEY variable is exported for a next usage.

    echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid","text":"
    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n

    We save this value in the PODUID exported variable, for next usage

    export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
    echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID","text":"

    The default kubelet's pod directory is /var/lib/kubelet/pods/. If you change it during the installation process replace /var/lib/kubelet/pods/ by your own directory.

    ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
    ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root   60 Dec  8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec  8 19:43 ..\nsrwxrwxrwx 1 1051 2051    0 Dec  8 19:43 X0\n

    X0 is a file unix socket, we will bind the X0 socket in the next podapp.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-home-hermes-volume-location","title":"Get the hermes's pod home-hermes volume location","text":"
    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n

    Description of this query

    • items[0] is the first entry of the pod list.
    • spec.volumes is an array
    • read all entries in spec.volumes where the @.name==\"home-hermes\" and return .hostPath.path

    We save this value in the PODHOME exported variable, for next usage

    export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n

    Check the value with a echo

    echo $PODHOME\n/tmp/hermes-conrad\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04","text":"

    Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume

    • to the X11 socket /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket:/tmp/.X11-unix
    • to the user homedir $PODHOME:/home/balloon
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-container-in-the-pod-sandbox-with-config-file","title":"Create container in the pod sandbox with config file","text":"

    We use envsubst to replace variable content in a template yaml file.

    Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:

    brew install gettext

    The variables ${PODUID}, ${PODHOME} and ${XAUTH_KEY} are exported.

    Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst

    Create a file podapp.template.yaml

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

    Run the envsubst command to replace ${PODUID}, ${PODHOME} and ${XAUTH_KEY}

    envsubst < podapp.template.yaml > podapp.yaml \n

    Dump the podapp.yaml file content, and check that the volumes are set with the new values.

    # cat podapp.yaml \n
    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: /bin/sleep 1d\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n

    Create the application pod

    kubectl apply -f podapp.yaml \npod/podapp created\n

    Check that your pod podapp is Running

    kubectl get pods podapp  -n abcdesktop\nNAME     READY   STATUS    RESTARTS   AGE\npodapp   1/1     Running   0          32s\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp","text":"

    You get a shell command inside the container.

    kubectl exec -it podapp  -n abcdesktop -- bash \n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"
    apt-get update && apt-get install -y xauth\n
    export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n

    You can read on stdout

    root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth:  file /root/.Xauthority does not exist\nroot@podapp:/#\n

    The file /root/.Xauthority does not exist, it has been created.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#install-your-x11-applications","title":"Install your X11 applications","text":"

    For example, I choose to install the x11-apps package

    Replace x11-apps by your own application

    apt-get install -y x11-apps\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"

    To start the X11 application, just run it. Your DISPLAY is set to :0.0, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1).

    But remember you a running a container as root, and all commands are running as root inside the container.

    Start xedit

    xedit\n

    Go back to your web browser.

    A new x11 window xedit should be present on your display

    xedit doesn't write any error message in the bash container.

    You've get a shell inside a container to run and start any application. You can also install and start any others applications.

    To clean the running pod podapp

    kubectl delete pods podapp -n abcdesktop \n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04 as hermes","text":"

    To start a new container from ubuntu:20.04 as hermes, we have to add the localaccount secret volume to the previous container

    Read the securityContext from the hermes pod

    export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n

    Check the uidNumber and the gidNumber values

    echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n

    Create a file hermespodapp.template.yaml

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: ${PODRUNASUSER}\n    runAsGroup: ${PODRUNASGROUP}\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

    Create your hermespodapp.yaml file from the previous template

    envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n

    Look at your hermespodapp.yaml

    cat hermespodapp.yaml \n
    apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: 1051\n    runAsGroup: 2051\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: 306908f8e4d4768c7595ce5ad53479\n

    Create the hermespodapp

    kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n

    To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc to get a rooted shell.

    Read the containerID of the pod hermespodapp

    CONTAINER=$(kubectl -n abcdesktop  get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n

    Get the shell with runc command

    runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n

    This is correct group ID 2051 does not exit. Let's patch your file system with hermes credentials

    • /etc/passwd
    • /etc/group
    • /etc/shadow
    • /etc/gshadow
    rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n

    Now your files are updated. You can exit, and reopen a bash to your container

    root@hermespodapp:/# exit\n
    # runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n

    The error message does not appear anymore.

    Install your X11 applications as root

    apt-get update && apt-get install -y x11-apps\n

    Quit the root session

    exit\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes","text":"

    Start a new session to the pod hermespodapp

    kubectl -n abcdesktop exec -it hermespodapp -- bash \n

    You get a shell prompt as as hermes. Check the hermes homedirectory and id number

    hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n

    Export the var DISPLAY and start the edit application. You don't need to create the .Xauthority file. /home/hermes is already mounted as a volume.

    hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n

    This process is running as hermes :

    hermes@hermespodapp:~$ ps -ef\nUID          PID    PPID  C STIME TTY          TIME CMD\nhermes         1       0  0 15:57 ?        00:00:00 /bin/sleep 1d\nhermes       690       0  0 16:47 pts/0    00:00:00 bash\nhermes       699     690  0 16:48 pts/0    00:00:00 xedit\nhermes       700     690  0 16:49 pts/0    00:00:00 ps -ef\n

    Go back to your web browser.

    A new x11 window xedit should be present on your display

    The name of the edit window is the name of your pod (hermespodapp).

    To clean the running pod hermespodapp

    kubectl delete -f hermespodapp.yaml \n

    You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.

    "},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"

    Only supported in abcdesktop release 3.0

    An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.

    You must have your own NFS server running with the share exported before you can use it.

    "},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update the od.config file","text":"

    Update the od.config to add

    • a label to user
    • add a desktop rules to match the label
    "},{"location":"common/3.0/mount_nfs_tag/#add-a-label-in-the-auth-provider","title":"Add a label in the auth provider","text":"

    In this example, we add a label nfsuser as a condition to mount nfs resource

    In the auth provider add a dummy condition or a memberOf condition. All types of conditions are supported, the goal is only to get a label.

    Update the od.config file and look for the default ldapconfig dictionnary

    "},{"location":"common/3.0/mount_nfs_tag/#add-a-dummy-condition","title":"Add a dummy condition","text":"
    ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-dummy': { \n             'conditions' : [ { 'boolean': True, 'expected' : True  } ],\n             'expected' : True,\n             'label': 'nfsuser' } } } } } }\n
    "},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf condition","text":"
    ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-nfsuser':  { \n              'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ],\n              'expected' : True, \n              'label': 'nfsuser' } } } } }\n
    "},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule in the desktop.policies","text":"

    In this example, we define entries :

    • nfsserver is 192.168.7.101 (can also be a FQDH)
    • path is /volume1/isostore
    • mountPath is /mnt/iso

    The mount command become like:

    mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n

    Update the desktop.policies dictionnary and add a new key rules. In the new rules define a new entry nfsuser.

    The name of the entry MUST match a user label tag, else the mount point is not created.

    In this example the label is defined as nfsuser, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume

    desktop.policies: {  \n'acls' : {},\n'rules': { \n  'volumes': { \n    'nfsuser': {\n      'type': 'nfs', \n      'name': 'isostore', \n      'server': '192.168.7.101',\n      'path': '/volume1/isostore',\n      'mountPath': '/mnt/iso',\n      'readOnly': True } } } } \n
    "},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config file","text":"

    Save your local changes in od.config, and update the new configmap abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
    "},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos","text":"

    Restart pyos pods

    kubectl delete pod -l run=pyos-od -n abcdesktop\n
    pod \"pyos-od-5586b88767-64jwt\" deleted\n
    "},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad and list nfs files","text":"

    Open the url http://localhost:30443, in your web browser, to start a simple user's pod.

    http://localhost:30443\n
    • Login with a user Hermes Conrad for example. Hermes Conrad is member of admin_staff.

    • Check that the label nfsuser is listed

    • Run a web shell to list the /mnt/iso directory content

    You can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section

    "},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"

    Let talk about a common features with multiple groups and user securityContext on pods

    "},{"location":"common/3.0/multiplegroupsfeature/#context","title":"context","text":"
    • Use ldap auth like in sample config ou=people,dc=planetexpress,dc=com
    • Use groups gidNumber and uidNumber
    • Use filesystem access right
    "},{"location":"common/3.0/multiplegroupsfeature/#goal","title":"Goal","text":"
    • Use the kubernetes supplemental groups support
    • Define accounts in ldap directory service to get supplementalGroups support
    "},{"location":"common/3.0/multiplegroupsfeature/#check-the-kubernetes-supplementalgroups-support","title":"Check the kubernetes supplementalGroups support","text":"

    Let's create a yaml file to define pod with securityContext and supplementalGroups

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: security-context-supplementalgroups-demo\nspec:\n  securityContext:\n    runAsUser: 1000\n    runAsGroup: 3000\n    supplementalGroups: [2000,4000,5000,6000]\n  volumes:\n  - name: sec-ctx-vol\n    emptyDir: {}\n  containers:\n  - name: sec-ctx-demo\n    image: busybox:1.28\n    command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n    volumeMounts:\n    - name: sec-ctx-vol\n      mountPath: /data/demo\n    securityContext:\n      allowPrivilegeEscalation: false\n

    Create the pod security-context-supplementalgroups-demo

    $ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n

    The pod is created

    pod/security-context-supplementalgroups-demo created\n

    Test the id command, you get the list uid=1000 gid=3000 groups=2000,4000,5000,6000

    $ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n

    Run the group command inside the pod

    $ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n

    The result exit with code 1. The groups do not exist in /etc/group

     3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n

    This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid, gid and supplementalgroups are read from posixAccount and posixGroup in the directory service.

    "},{"location":"common/3.0/multiplegroupsfeature/#read-specsecuritycontext-from-a-pod","title":"Read .spec.securityContext from a pod","text":"

    kubectl command to read .spec.securityContext

    kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n

    You read as output

    {\n  \"runAsGroup\": 3000,\n  \"runAsUser\": 1000,\n  \"supplementalGroups\": [\n    2000,\n    4000,\n    5000,\n    6000\n  ]\n}\n
    "},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"
    • defined a user in the LDAP series

    The complete ldif file can be downloaded at the end of this page.

    The ldif set :

    • organizationalUnit people: ou=people,dc=planetexpress,dc=com
    • organizationalUnit groups: ou=groups,dc=planetexpress,dc=com

    Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com - gidNumber: 1036 - uid: hermes - uidNumber: 1035

    Create a posixGroup for hermes : cn=hermes,ou=groups,dc=planetexpress,dc=com

    • objectClass: posixGroup
    • objectClass: top
    • cn: hermes
    • gidNumber: 1036

    Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com

    • cn: accountant
    • gidNumber: 18430
    • memberUid: hermes

    Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com

    • gidNumber: 20467
    • memberUid: fry
    • memberUid: hermes
    "},{"location":"common/3.0/multiplegroupsfeature/#login-to-abcdesktop","title":"Login to abcdesktop","text":"

    Login to abcdesktop as Hermes Conrad account

    Inside the user pod, the unix group file contains :

    cat /etc/group\n
    hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

    This is correct.

    The user's pod is defined with a securityContext

    In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27 by your own pod's name

    kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext'  \n

    You can read on stdout

    {\n  \"runAsGroup\": 1036,\n  \"runAsUser\": 1035,\n  \"supplementalGroups\": [\n    20467,\n    18430\n  ]\n}\n

    This is correct. supplementalGroups defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com

    Inside the user pod run the id command

    hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

    This is correct.

    "},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"

    The default home directory in od.config is a volume hostPath set to /tmp

    desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

    On your host server, get a shell with as root account, create a file humansfile with restricted access to member of humans group.

    cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

    Check the owner and group of the new file humansfile

    ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

    Check inside the user pod check that hermes account can write data in the new file humansfile.

    This is correct hermes is member of humans group.

    hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
    hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

    This is correct.

    The user's pod is defined with a securityContext

    'securityContext': {\n  'runAsUser': 1035,\n  'runAsGroup': 1036,\n  'supplementalGroups': [20467, 18430] \n}\n

    This is correct. supplementalGroups defines the others groups from LDAP

    Inside the user pod run the id command

    hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

    This is correct.

    "},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"

    The default home directory in od.config is a volume hostPath set to /tmp

    desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

    On your host server, using a root account, create a file humansfile with restricted access to member of humans group.

    cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

    Check the owner and group

    ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

    Check inside the user pod check that hermes account can to write data in file humansfile, because hermes is member of humans group.

    hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n

    This is correct.

    We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

    "},{"location":"common/3.0/multiplegroupsfeature/#ldap-ldif-dump","title":"LDAP ldif dump","text":"

    To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

    version: 1\n=======\nhermes:~$ \n

    This is correct.

    We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

    "},{"location":"common/3.0/multiplegroupsfeature/#ldif-dump","title":"ldif dump","text":"

    To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

    version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
    "},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":"

    abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

    "},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":"
    • docker package installed
    "},{"location":"common/3.0/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop default frontend web page to use your own.
    • Create new image for abcdesktop oc.nginx
    "},{"location":"common/3.0/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

    In the od.config, add the env var ABCDESKTOP_BG_COLOR

    desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

    Then update the config map abcdesktop-config and restart deployment pyos-od

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

    You should read on stdout

    configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n
    "},{"location":"common/3.0/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.0/update_frontend_image/#download-uijson-file","title":"Download ui.json file","text":"

    Download the ui.json file. ui.json is located in webModules/transpile/config directory of webModules abcdesktop's repository.

    mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n

    ui.json is a json dictionary file

    The main entres are :

    • name, name is the name of your project.
    • projectNameSplitedHTML, is the animated span name of your project.
    entry default value example name abcdesktop.io acmedesktop.io projectNameSplitedHTML <span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span> <span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
    {\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name of the project, and projectNameSplitedHTML to

      \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n

    Change the color @x11bgcolor with your own.

    entry name new color value @x11bgcolor #18974c

    You should use the same value for ABCDESKTOP_BG_COLOR and for @x11bgcolor.

    Example

    {\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n   \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974C\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile to build the new image","text":"

    Dockerfile

    #\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder          \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
    "},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"

    Run the docker build command to build the new oc.nginx:acme image

    docker build -t oc.nginx:acme .\n
    # docker build -t oc.nginx:acme .\nSending build context to Docker daemon  21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.2\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.2\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\"       maintainer=\"acmedesktop\"       version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n

    Run the docker images command to read the new oc.nginx image

    docker images \n\nREPOSITORY              TAG       IMAGE ID       CREATED         SIZE\noc.nginx                acme      b5449d85393f   2 minutes ago   685MB\n
    "},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"
    docker image save oc.nginx:acme -o oc.nginx.acme\n
    "},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme in k8s.io namespace for containerd","text":"

    The oc.nginx.acme not is listed in the k8s.io namespace.

    Run the ctr command line to import oc.nginx.acme

    ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n

    Check that your new image is listed

    ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme                                                                                                  application/vnd.docker.distribution.manifest.v2+json      sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64                                                                                                                        io.cri-containerd.image=managed \n
    "},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"

    Update your own abcdesktop.yaml file to replace the default image abcdesktopio/oc.nginx:3.0 by the new container image oc.nginx:acme name.

     containers:\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.2\n

    Replace :

    • image: abcdesktopio/oc.nginx:3.2 by image: oc.nginx:acme
     containers:\n      - name: nginx\n        image: oc.nginx:acme\n

    Apply the new abcdesktop.yaml file

    kubectl apply -f abcdesktop.yaml \n

    The deployment.apps/nginx-od is configured

    clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n

    Start you web browser. You can read the new project name at the home page. After login you get the new color.

    You have updated the html web page for abcdesktop release 3.X

    "},{"location":"common/3.3/update_frontend_image/","title":"Update and custom frontend web page","text":"

    abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

    "},{"location":"common/3.3/update_frontend_image/#requirements","title":"Requirements","text":"
    • docker package installed
    "},{"location":"common/3.3/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop default frontend web page to use your own.
    • Create new image for abcdesktop oc.nginx
    "},{"location":"common/3.3/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

    In the od.config, add the env var ABCDESKTOP_BG_COLOR

    desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

    Then update the config map abcdesktop-config and restart deployment pyos-od

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

    You should read on stdout

    configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n

    The new desktop is defined with the default background color

    We need to change the top color with the same new default value #18974c

    Update the oc.nginx container image to add #18974c inside the new graphic chart.

    "},{"location":"common/3.3/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.3/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
    git clone -b 3.3 https://github.com/abcdesktopio/webModules.git\n
    "},{"location":"common/3.3/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/3.3/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

    Update your ui.json file. ui.json is located in transpile/config directory.

    ls -la  webModules/transpile/config\ntotal 204\ndrwxr-xr-x   5 alexandredevely  staff   160 Nov 29 14:54 .\ndrwxr-xr-x  11 alexandredevely  staff   352 Nov 29 14:54 ..\n-rw-r--r--   1 alexandredevely  staff    34 Nov 29 14:54 .cache.json\n-rw-r--r--   1 alexandredevely  staff  1924 Nov 29 14:54 modules.json\n-rw-r--r--   1 alexandredevely  staff  1548 Nov 29 14:54 ui.json\n

    ui.json is a json dictionary file

    The main entry is name, name is the project name:

    entry default value example name abcdesktop.io acmedesktop.io
    {\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='p\nrojectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.3/update_frontend_image/#login-progress","title":"Login progress","text":"

    Login progress is embedded in span HTML tags. Each projectNameSplitedStage describes a step during the user's authentification then pod's creation process.

    • projectNameSplitedStagea: step 1
    • projectNameSplitedStageb: step 2
    • projectNameSplitedStagec: step 3
    • projectNameSplitedStaged: step 4
    <span id='projectNameSplitedStagea'>a</span>\n<span id='projectNameSplitedStageb'>b</span>\n<span id='projectNameSplitedStagec'>c</span>\n<span id='projectNameSplitedStaged'>desktop</span>\n
    "},{"location":"common/3.3/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/3.3/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name abcdesktop to acmedesktop

    \"name\": \"acmedesktop.io\"\n

    Update the projectNameSplitedHTML values, the @tertiary and @x11bgcolor colors

        {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974c\"\n    },\n

    Example with new acmedesktop

    {\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='p\nrojectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.3/update_frontend_image/#build-your-new-image","title":"build your new image","text":"

    Run the docker build command to build the new oc.nginx:acme image

    The target image is abcdesktopio/oc.nginx:acme you should change it with your own for example myacme/oc.nginx:acme

    docker build --build-arg NODE_MAJOR=20 --build-arg BASE_IMAGE=abcdesktopio/oc.nginx.builder --build-arg BASE_IMAGE_RELEASE=3.3 --build-arg TARGET=dev  -t abcdesktopio/oc.nginx:acme -f Dockerfile .\n
    docker build --build-arg NODE_MAJOR=20 --build-arg BASE_IMAGE=abcdesktopio/oc.nginx.builder --build-arg BASE_IMAGE_RELEASE=3.3 --build-arg TARGET=prod  -t abcdesktopio/oc.nginx:acme -f Dockerfile .\n[+] Building 16.5s (19/19) FINISHED                                                                                                                          docker:default\n => [internal] load build definition from Dockerfile                                                                                                                   0.0s\n => => transferring dockerfile: 962B                                                                                                                                   0.0s\n => [internal] load metadata for docker.io/library/nginx:latest                                                                                                        0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.nginx.builder:3.3                                                                                           0.0s\n => [internal] load .dockerignore                                                                                                                                      0.0s\n => => transferring context: 2B                                                                                                                                        0.0s\n => CACHED [stage-1 1/2] FROM docker.io/library/nginx:latest                                                                                                           0.0s\n => CACHED [builder  1/11] FROM docker.io/abcdesktopio/oc.nginx.builder:3.3                                                                                            0.0s\n => [internal] load build context                                                                                                                                      0.1s\n => => transferring context: 265.27kB                                                                                                                                  0.1s\n => [builder  2/11] RUN echo current branch is                                                                                                                         0.2s\n => [builder  3/11] RUN echo NODE release is 20                                                                                                                        0.2s\n => [builder  4/11] RUN echo current target is prod it can be 'dev' or 'prod'                                                                                          0.2s\n => [builder  5/11] COPY . /var/webModules                                                                                                                             0.4s\n => [builder  6/11] WORKDIR /var/webModules                                                                                                                            0.1s\n => [builder  7/11] RUN make clean                                                                                                                                     0.7s\n => [builder  8/11] RUN make prod                                                                                                                                      9.7s\n => [builder  9/11] RUN ./mkversion.sh && cat version.json                                                                                                             0.2s\n => [builder 10/11] RUN /myenv/bin/html5validator index.html                                                                                                           2.0s \n => [builder 11/11] RUN make removebuildtools                                                                                                                          0.8s \n => [stage-1 2/2] COPY --from=builder /var/webModules /usr/share/nginx/html                                                                                            0.7s \n => exporting to image                                                                                                                                                 0.7s \n => => exporting layers                                                                                                                                                0.7s \n => => writing image sha256:d7bdbc9f7fafe3282161551e84c5997bb12051bded6405190267863dd73a1698                                                                           0.0s\n => => naming to docker.io/abcdesktopio/oc.nginx:acme  \n
    "},{"location":"common/3.3/update_frontend_image/#update-the-abcdesktopyaml","title":"update the abcdesktop.yaml","text":"

    To update the abcdesktop.yaml to replace abcdesktopio/oc.nginx:3.3 by your own image myacme/oc.nginx:acme

    • edit your own abcdesktop.yaml file
          [...]\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.3\n        ports:\n          - containerPort: 80\n            name: http\n      [...]\n

    Update the deployement with your new image name abcdesktopio/oc.nginx:acme

          [...]\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:acme\n        ports:\n          - containerPort: 80\n            name: http\n      [...]\n

    apply your abcdesktop.yaml file

    kubectl apply -f abcdesktop.yaml\n
    role.rbac.authorization.k8s.io/pyos-role unchanged\nrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nconfigmap/configmap-mongodb-scripts unchanged\nsecret/secret-mongodb configured\ndeployment.apps/mongodb-od configured\ndeployment.apps/memcached-od configured\ndeployment.apps/router-od configured\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od configured\ndeployment.apps/pyos-od configured\ndeployment.apps/console-od configured\ndeployment.apps/openldap-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/pyos unchanged\nservice/console unchanged\nservice/http-router unchanged\nservice/website unchanged\nservice/openldap unchanged\n
    "},{"location":"common/3.3/update_frontend_image/#connect-to-your-new-website","title":"Connect to your new website","text":"

    Open your web browser to your abcdesktop website

    • acmedesktop login page

    • acmedesktop login process

    • acmedesktop colors updated

    "},{"location":"core/memcached/","title":"Memcached","text":"

    The memcached container comes from the public docker registry. This service is attend to the netback network.

    memcached store pods and containers message during the create process.

    "},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"

    Messages stored into memcache

    status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"

    Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.

    The mongodb container comes from the public docker registry. This service is attend to the netback network.

    "},{"location":"core/mongodb/#collections","title":"Collections","text":"

    abcdesktop.io uses the colections mongodb to store

    • webrtc call history
    • login history
    • dock web state
    "},{"location":"core/mongodb/#dock-state","title":"dock state","text":"
    • The dock state is stored as an array of application name.
    • The dock state is stored when the user changes it (for exemple add or remove an application inside the dock zone ).
    • The collection's name is the userid. The key's name is 'dock'
    [ \n    \"keyboard\",\n    \"frontendjs.filemanager\",\n    \"Mail.Thunderbird\",\n    \"libreoffice.libreoffice-calc\",\n    \"libreoffice.libreoffice-writer\",\n    \"Navigator.Firefox\",\n    \"gimp.Gimp\",\n    \"gnome-terminal.Gnome-terminal\"\n]\n
    "},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"
    • Login History is an object collection.
    • One collection is created for each user.
    • The collection's name is the userid.
    • The javascript code can only read and NEVER write data to the loginHistory collection.

    The object's format is :

    {\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
    • _id : is the mongodb id
    • sub : is the userid
    • ipaddr : is the client ip address
    • provider : authenticated provider
    • date : date formated
    • useragent : user browser description
    • name : the user name
    "},{"location":"core/mongodb/#method","title":"method","text":"

    The method getCollection, is a ligth way to get a collection on the fron-end side.

    For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.

     getCollection('loginHistory', function(msg) {\n            if (msg.status === 200) {\n                var history = msg.result;\n                loginHistory = history;\n                buildHtmlTable(history);\n            }\n        })\n
    "},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"

    Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).

    "},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":"
    • Read the nginx nginx.conf configuration file
    • Read the nginx default web site configuration file
    • Read the route.conf configuration file, use to route HTTP request
    • Read the proxy.conf configuration file, use to proxy HTTP request
    "},{"location":"core/nginx/#web-site","title":"web site","text":"

    The static files (html, css, js) are stored in the local /var/webModules directory.

    "},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":"
    • moauth|fauth|gauth|oauth|autologin|API|status are routed to od.py http://$my_proxy:$api_service_tcp_port;
    • /spawner is routed to nodejs spawner service http://$target:$spawner_service_tcp_port;
    • /websockify is routed to websocket http://$target:$ws_tcp_bridge_tcp_port/;
    • /u8_1_11025 is routed to pulseaudio sound service http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;
    • /filer is routed to nodejs filer service http://$target:8080
    • /broadcast is routed to nodejs broadcast service http://$target:$broadcast_tcp_port;
    "},{"location":"core/nginx/#lua-scripts","title":"LUA scripts","text":"

    The /etc/nginx/get.targetmap.lua read the jwt_token and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key and the jwt_desktop_payload_private_key

    It uses a targetmap (dict) as first cache level.

    lua_shared_dict targetmap 1m;\n

    Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.

    "},{"location":"core/ocuser/","title":"The POD User","text":"

    After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.

    "},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"

    The pod user runs by default a container with the graphical image : the oc.user.18.04.

    A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage and desktop.printerimage].

    "},{"location":"core/ocuser/#processes-running-inside-the-user-container","title":"Processes running inside the user container","text":"

    All processes are running as the user named balloon, because none of theme need to run as root.

    The userid and the guid are 4096.

    "},{"location":"core/ocuser/#supervisord","title":"Supervisord","text":"

    Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.

    /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n

    Supervisor is the parent of all running process

    docker-entrypoi---supervisord-+-Xvnc\n                              |-node---10*[{node}]\n                              |-4*[nodejs---10*[{nodejs}]]\n                              |-nodejs---6*[{nodejs}]\n                              |-nodejs-+-bash---pstree\n                              |        `-11*[{nodejs}]\n                              |-openbox\n                              `-xsettingsd\n
    "},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"

    TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.

    Starts parameters

    command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n

    The default DISPLAY is :0. Xvnc listen on unix socket file /tmp/.x11vnc.

    "},{"location":"core/ocuser/#openbox","title":"Openbox","text":"

    Openbox is the window manager, it supports extensive standards support.

    Openbox is patched with few line to send SIG_USR1 and SIG_USR2 messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.

    This patch add notification when X11/window change :

    The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)

    #define SIG_MANAGED_WINDOW   SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n
    • SIGUSR1: when a new window is created
    • SIGUSR2: when a window is closed

    Openbox is started by supervisord using the command :

    command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
    "},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"

    ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

    ws-tcp-bridge is started by supervisord using the command :

    /composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
    "},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"

    spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :

    • launch: start a new application inside the container [ use for builtin applications ]
    • filesearch: search file by keywords
    • activate: activate a window
    • raise: raise a window
    • minimize: minimize a window
    • close: close a window
    • getwindowslist: get window list
    • activatewindow: activate a window
    • closewindow
    • minimizewindow
    • raisewindow
    • info: get container information
    • clipboardsync: Sync primary clipboard to gtk default clipboard
    • getbroadcastwindowslist: broadcast the window list to all connected users
    • getappforfile: get the application key for a filename
    • getmimeforfile: get the mime type for a filename
    • echo: return an echo string

    spawner-service.js is started by supervisord using the command :

    command=nodejs /composer/node/spawner-service/spawner-service.js\n
    "},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"

    Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :

    command=nodejs /composer/node/printer-service/printer-service.js\n
    "},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"

    Broadcast-service.js allows to broadcast messages between all user sharing the same session.

    Broadcast-service.js is started by supervisord using the command :

    command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
    "},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"

    File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.

    http.createServer(function(req, res) {\n  if (req.method === 'POST') {\n    uploadFile( req, res );\n  } \n  else if (req.method === 'GET') {\n        respondFile( req, res );\n  }\n}).listen(8080, function() {\n  console.log('Listening for requests');\n});\n

    File-service.js is started by supervisord using the command :

    command=nodejs /composer/node/file-service/file-service.js\n
    "},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"

    PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.

    file etc/pulse/default.pa

    load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n

    Pulseaudio is started by supervisord using the command :

    command=/usr/bin/pulseaudio\n
    "},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"

    Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:

    Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n

    Xsettingsd is started by supervisord using the command.

    command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
    "},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"

    The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.

    +-------------------+\n| oc.user.18.04     |       (abcdesktop.io custom software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.software.18.04 |       (abcdesktop.io ubuntu software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.ubuntu.18.04   |       (abcdesktop.io ubuntu service)\n+-------------------+\n          |\n+---------+---------+\n|   ubuntu:18.04    |   (official ubuntu images from dockerhub)\n+-------------------+\n

    To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.

    docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04   -f oc.user.18.04 .\n

    To do it automaticly, clone composer/dockerbuild and run the Makefile

    git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
    "},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"

    oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:

    • nodejs: use by services
    • tiger VNC: X11 server
    • supervisor: service manager
    • xsettingsd: for X11 params
    • pulseaudio: fo sound
    • openbox: the windows manager
    • cups and cups-pdf: for printing support
    "},{"location":"core/ocuser/#dockerfile-ocsoftwarexxyy","title":"Dockerfile oc.software.XX.YY","text":"

    oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:

    • gnome-terminal
    • xclip
    "},{"location":"core/ocuser/#dockerfile-ocuserxxyy","title":"Dockerfile oc.user.XX.YY","text":"

    oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:

    "},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"
    # Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install  \nRUN cd /composer/node/file-service      && npm install\nRUN cd /composer/node/printer-service   && npm install\nRUN cd /composer/node/spawner-service   && npm install  \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
    "},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"
    RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"
    # change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN     chown -R $BUSER:$BUSER /var/spool/cups            && \\\n        chown -R $BUSER:$BUSER /var/spool/cups-pdf      && \\\n        chown -R $BUSER:$BUSER /var/log/cups                && \\\n        chown -R $BUSER:$BUSER /var/cache/cups          && \\\n        chown -R $BUSER:$BUSER /etc/cups/printers.conf  && \\\n        chown -R $BUSER:$BUSER /var/run/cups/\n
    "},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"

    Datas to these tcp ports are routed by nginx

    PULSEAUDIO_HTTP_PORT                4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT      6081\nRESERVED_FOR_NEXT_VERSION           29780\nXTERM_TCP_PORT                      29781\nFILE_SERVICE_TCP_PORT               29783\nBROADCAST_SERVICE_TCP_PORT          29784\nRESERVED FOR CUPSD                  29785\nSPAWNER_SERVICE_TCP_PORT            29786\n
    "},{"location":"core/pyos/","title":"pyos","text":"

    oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :

    • 'login' : Request a login session, create a new user container if it does not exist.
    • 'getkeyinfo' : Return the public key from a provider
    • 'logout' : logout the container
    • 'logs' : return logs from a started container
    • 'getapplist' : return all avalaible applications
    • 'install' : [ deprecated ] install a package
    • 'share' : send a auth token to the email to share the desktop
    • 'support' : send a support request
    • 'restart' : retart the user container
    • 'ocrun' : start a application
    • 'ocstop' : stop the container
    • 'whoami' : return a JSON object whoami
    • 'set' : set a key value
    • 'get' : get value from a key
    • 'setcollection' : add value to a collection
    • 'getcollection' : get all values from a collection
    "},{"location":"core/speedtest/","title":"SpeedTest","text":"

    The speedtest container comes from the public docker registry.

    "},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"

    LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.

    "},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    A sample API

    Base URLs:

    • /
    "},{"location":"services/file-service/#file-service-default","title":"Default","text":""},{"location":"services/file-service/#get__","title":"get__","text":"

    GET /

    Get file from the home directory

    Example responses

    403 Response

    "},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"

    POST /

    Upload a file at a given path

    Body parameter

    Example responses

    200 Response

    "},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"

    DELETE /

    Remove a given file wich is present in home directory

    Body parameter

    {\n  \"myFilename\": \"string\"\n}\n
    "},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none

    Example responses

    200 Response

    "},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 400

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"

    GET /directory/list

    List files in a given directory

    "},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    A sample API

    Base URLs:

    • /
    "},{"location":"services/spawner-service/#spawner-service-default","title":"Default","text":""},{"location":"services/spawner-service/#get__version","title":"get__version","text":"

    GET /version

    Get User container version

    Example responses

    200 Response

    {\n  \"date\": null,\n  \"commit\": \"string\",\n  \"version\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"

    POST /launch

    Used to run builtin application process

    Body parameter

    {\n  \"command\": \"string\",\n  \"args\": [\n    \"string\"\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"

    POST /setAudioQuality

    Set the audio quality

    Body parameter

    {\n  \"sink\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"

    POST /playAudioSample

    Play a sample audio

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"

    PUT /configurePulse

    Configure pulse audio for Janus

    Body parameter

    {\n  \"destinationIp\": \"string\",\n  \"port\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"

    POST /broadcastwindowslist

    Emit a broadcast with window list as data

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"

    POST /clipboardsync

    Synchronize X11 and gtk clipboard

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"

    POST /setDesktop

    Store a data as json file in desktop

    Body parameter

    {\n  \"key\": \"string\",\n  \"value\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"

    GET /getDesktop

    Get a data stored as json file

    "},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"

    GET /getmimeforfile

    Get a mime for a given filename

    "},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true none

    Example responses

    200 Response

    {\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"

    GET /filesearch

    Used for list files by dock

    "},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"file\": \"string\",\n      \"mime\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"

    POST /generateDesktopFiles

    Build desktop files to run containerized applications

    Body parameter

    {\n  \"list\": [\n    {\n      \"mimetype\": \"string\",\n      \"path\": \"string\",\n      \"executablefilename\": \"string\",\n      \"icon\": \"string\",\n      \"name\": \"string\",\n      \"launch\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"

    GET /getappforfile

    Allow to get the app necessary

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"

    GET /about

    Get system informations

    Example responses

    200 Response

    {\n  \"hostname\": \"string\",\n  \"ipaddr\": \"string\",\n  \"plateform\": \"string\",\n  \"arch\": \"string\",\n  \"release\": \"string\",\n  \"cpu\": \"string\",\n  \"clientipaddr\": \"string\",\n  \"country\": \"string\",\n  \"language\": \"string\",\n  \"build\": \"string\",\n  \"POD_NAMESPACE\": \"string\",\n  \"POD_NAME\": \"string\",\n  \"NODE_NAME\": \"string\",\n  \"POD_IP\": \"string\",\n  \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"

    GET /getSettings

    Get configuration for settings window

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"tab\": \"string\",\n      \"enabled\": true\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"

    POST /setBackgroundColor

    Change the background color

    Body parameter

    {\n  \"color\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"

    POST /setBackgroundImage

    Set the background image

    Body parameter

    {\n  \"imgName\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {\n    \"color\": \"string\",\n    \"subData\": {\n      \"code\": 0,\n      \"data\": \"string\"\n    }\n  }\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"

    POST /setDefaultImage

    Set the default image as background

    Example responses

    200 Response

    "},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"

    GET /getwindowslist

    Get window list

    Example responses

    200 Response

    "},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"

    POST /activatewindows

    Activate windows

    Body parameter

    {\n  \"windowsid\": [\n    0\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"

    POST /closewindows

    Close windows

    Body parameter

    {\n  \"windowsid\": [\n    0\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"

    POST /placeAllWindows

    Place and resize all windows

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"
    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n
    "},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"
    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n

    All operations completed with success

    "},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"
    {\n  \"code\": 0,\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"
    {\n  \"code\": 0,\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"
    {\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"
    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n\n
    "},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"

    Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.

    abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io

    This article is just an update from Fabian St\u00e4ber work.

    "},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"

    Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.

    Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.

    "},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"

    The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/.

    The plugin directory can be configured with the kubelet's --volume-plugin-dir parameter, run ps aux | grep kubelet to learn the location of the plugin directory on your system (see [#1][9]). The cifs script must be located in a subdirectory named abcdesktop~cifs/. The directory name abcdesktop~cifs/ will be mapped to the Flexvolume driver name abcdesktop/cifs.

    On the Kubernetes master and on each Kubernetes node run the following commands:

    VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n

    The cifs script requires a few executables to be available on each host system:

    • mount.cifs, on Ubuntu this is in the cifs-utils package.
    • jq, on Ubuntu this is in the jq package.
    • mountpoint, on Ubuntu this is in the util-linux package.
    • base64, on Ubuntu this is in the coreutils package.
    apt-get install cifs-utils jq util-linux coreutils\n\n

    To check if the installation was successful, run the following command:

    VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n

    It should output a JSON string containing \"status\": \"Success\". This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.

    "},{"location":"setup/kubernetes_flexvolume/#update-your-odconfig-file","title":"Update your od.config file","text":"

    In this example, we use a Microsoft Active Directory as a LDAP Server.

    CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode

    Add a new policy to add a label TAG during the user's authentification process.

    \n# Add an explicit authmanagers\nauthmanagers: { \n    'explicit': {\n        'show_domains': True,\n        'default_domain': 'AD',\n        'providers': {\n          'AD': { \n            'config_ref': 'adconfig', \n            'enabled': True\n           }\n        }\n    }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ '192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                       'policies'      : { 'acls': None,\n                                           'rules' : { 'rule-domainuser' : {\n                                                  'conditions' : [ { 'primarygroupid': '513', 'expected' : True  } ],\n                                                  'expected'   : True,\n                                                  'label'      : 'domainuser' } \n} } } } } } }\n\n

    In this example :

    • To verify that a user is member of DOMAIN USER group, we check that the user's primaryGroupID is equal to 513
    • If the primaryGroupID is equal to 513 the authentification process add the label domainuser

    Then in the same od.config file, add rules to the desktop object to match this label domainuser

    desktop.policies: { 'rules': { 'volumes': { 'domainuser':  { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n                        'acls' : {} }\n\n

    In this example :

    • If the user's label is equal domainuser, then the user attribut homeDir is mounted to the homeDirectory by the CIFS flexvolume plugin.
    "},{"location":"setup/kubernetes_flexvolume/#testing","title":"Testing","text":""},{"location":"setup/kubernetes_flexvolume/#apply-new-configuration-file","title":"Apply new configuration file","text":"
    kubectl apply -f abcdesktop.yml\n

    Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.

    Run authentification on the Microsoft Active Direcotry Service or on your Samba server

    Start the File Manager application. In this example, the homeDir is set to U:, the mount entry become the letter U.

    Click on the homeDir to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex contains a file ```NAS-file.ods'

    "},{"location":"setup/kubernetes_flexvolume/#troubleshooting","title":"Troubleshooting","text":"

    Logs files are stored in host directory /var/log/abcdesktop/cifs

    # ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c.   1 12:00 ..\n-rw-r--r-- 1 root root  288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root  832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n-rw-r--r-- 1 root root   50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root   44 d\u00e9c.  22 12:20 umount.counter\n

    Check the file sAMAccountName.log, cifs.log

    If there is an error, look at the error.$sAMAccountName.json and error.$sAMAccountName.log

    Example

    -rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n

    Run mount command

    mount

    In this example :

    • 192.168.7.101 is the IP Address of the NAS server
    • //192.168.7.101/alex is the shared ressource
    • alex is the sAMAccountName
    # mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n

    Check that the kubernetes secrets exist

    kubectl get secrets -n abcdesktop\nNAME                                  TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload           Opaque                                2      65d\nabcdesktopjwtdesktopsigning           Opaque                                2      65d\nabcdesktopjwtusersigning              Opaque                                2      65d\nauth-cifs-alex-flexvol-cifs-homedir   abcdesktop/cifs                       4      10m\nauth-ldif-alex                        abcdesktop/ldif                       11     10m\n
    "},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"

    File need to be written

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"

    abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.

    abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.

    This flexible working environment simplifies usage like

    • Telecommuting
    • Remote virtual desktop
    • Give temporary access to other contractors or guests
    • Training
    • BYOD, Bring Your Own Device
    • Desktop On Demand, Desktop as a service
    "},{"location":"#quick-online-preview","title":"Quick online preview","text":"

    You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.

    To reach the demo website, follow the link https://demo.abcdesktop.io

    "},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"

    abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.

    "},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"

    You can watch the youtube video sample. This video describes the Quick installation process.

    Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
    "},{"location":"#adopters","title":"Adopters","text":"

    Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!

    Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":"
    • Complete native cloud desktop, workspace environment
    • Authentification OAuth 2.0, LDAP bind, LDAPS bind, Active Directory, Active Directory trust, Kerberos, NTLM
    • Access to the user home directory (homeDirectory support in Active Directory)
    • Legacy CIFS FlexVolume using kubernetes driver
    • All graphical applications run inside containers, as pods or as ephermeral containers
    • Local and remote printing support
    • Off-line sessions are maintained
    • No need to install applications any more
    • Application update, run latest image on your private registry
    • Accounting and reporting (Graylog, Prometheus Grafana)
    • Clipboard syncing with https
    • Sound support with WebRTC signalling and gstreamer webrtcbin
    • Nvidia GPU support for applications
    • Support RFC 2307 to use LDAP as a Network Information Service
    "},{"location":"#applications","title":"Applications","text":"
    • Native support GNU/Linux console native support
    • Native support GNU/Linux X11 applications native support
    • Support Microsoft Windows applications using Wine
    "},{"location":"#supported-web-browser-html","title":"Supported web browser HTML","text":"

    abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:

    • Chrome 49,
    • Firefox 58,
    • Safari 11,
    • Opera 36,
    • Microsoft Edge (based on Chromium)
    "},{"location":"#copy-and-paste-features","title":"Copy and Paste features","text":"

    To fully use copy and paste features, from your local device to your abcdesktop (and vice versa), choose Chrome, Chromium or Microsoft Edge Chromium. The copy and paste feature is also supported on Firefox with a dedicated abcdesktop extension.

    Web browser Clipboard sync Chrome Yes, built in support Chromium Yes, built in support Microsoft Edge Chromium Yes, built in support Firefox Yes, install the dedicated abcdesktop extension Safari No, the clipboard access is not allowed by the user agent or the platform in the current context, possibly because the user denied permission"},{"location":"#not-supported-web-browser","title":"Not supported web browser","text":"

    abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.

    "},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"

    abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.

    "},{"location":"adopters/","title":"Adopters","text":"

    Here are some of the organizations we know are using abcdesktop.io.

    Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications

    If you\u2019re using abcdesktop.io and aren\u2019t on this list, please submit a pull request to add entry in this list.

    "},{"location":"applicationsformat/","title":"Application image format","text":"

    abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.

    "},{"location":"applicationsformat/#requirements","title":"Requirements","text":"
    • A running container enegine (like dockerd)
    • An access to the docker public registry
    "},{"location":"applicationsformat/#labels","title":"Labels","text":"

    Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.

    LABEL oc.type=app\n
    "},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ] office oc.launch string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path string Path to the application binary /usr/bin/firefox oc.args string arguments added to the command --open oc.name string Name of the application Firefox oc.displayname string Display Name show by Web interface Firefox oc.type string Always set to the value 'app' app oc.mimetype string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview string Set to the dock to add this app in dock dock oc.fileextensions string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config dict dictionary of resources (see resources details) { 'shm_size': '1g' }

    Example for Firefox application

    LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
    "},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n

    Read the dedicated chapter for resource description, to get more informations on host_config

    "},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"

    To download an abcdesktop docker image, run the command

    docker pull abcdesktopio/firefox.d\n

    To inspect the labels in the docker image, run docker inspect

    docker inspect abcdesktopio/firefox.d:latest\n

    Read the labels section :

    \"Labels\": {\n                \"architecture\": \"x86_64\",\n                \"oc.cat\": \"office\",\n                \"oc.desktopfile\": \"firefox.desktop\",\n                \"oc.displayname\": \"Firefox\",\n                \"oc.fileextensions\": \"htm;html;xml;gif\",\n                \"oc.icon\": \"firefox.svg\",\n                \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n                \"oc.keyword\": \"firefox,mozilla,web,internet\",\n                \"oc.launch\": \"Navigator.Firefox\",\n                \"oc.legacyfileextensions\": \"htm;html;xml\",\n                \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n                \"oc.name\": \"Firefox\",\n                \"oc.path\": \"/usr/bin/firefox\",\n                \"oc.showinview\": \"dock\",\n                \"oc.template\": \"oc.template.gtk.firefox\",\n                \"oc.type\": \"app\",\n                \"oc.usedefaultapplication\": \"true\",\n                \"release\": \"5\",\n                \"vcs-ref\": \"master\",\n                \"vcs-type\": \"git\",\n                \"version\": \"1.2\"\n }\n
    "},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"

    All abcdesktop applications use by default the oc.template.gtk images name.

    "},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"

    By default, oc.templace.gtk is the main image for all applications. For example oc.template.gtk.firefox use the oc.template.gtk image. oc.template.gtk.firefox.acme use the oc.template.gtk.firefox.

    • The oc.template.gtk.firefox contains the Mozilla Firefox application.
    • The oc.template.gtk.firefox.acme may contain custom set for Mozilla Firefox application, like Root CA, proxy values or policy.json files for the acme.
    +------------------------------+\n|oc.template.gtk.firefox.acme  |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk.firefox       |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk               |\n+---------------+--------------+\n
    "},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"
    1. User login, get a user JWT
    2. Create a user POD (or a container) and retrieve a Desktop JWT
    3. Run, the user is connected to his own POD (or container)

      • All JWT are signed with RSA keys.
      • All JWT payload are encrypted with RSA keys
    "},{"location":"architecture/#services-infrastructure","title":"Services Infrastructure","text":"

    The service infrastructure is based on :

    • WebServer Nginx container
    • Database service MongoDB
    • Memcached service Memcached
    • Pyos Core service (abcdesktop engine) Pyos

    The user creates a pod user

    "},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"

    pyos is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :

    • Authenticate user on authenticate providers
    • OAuth 2.0 Provider : Google, Facebook, Orange
    • LDAP and LDAPS
    • Active Directory
    • Start/Stop user container in docker mode and Pod in Kubernetes mode
    • Start/Stop application container

    When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.

    "},{"location":"architecture/#nginx","title":"nginx","text":"

    nginx container act as web server and websocket reverse proxy.

    "},{"location":"architecture/#mongo","title":"mongo","text":"

    mongo is used by pyos to store user profil informations. The profil informations are :

    • Login history
    • Dock configuration
    • Image and background color configuration
    "},{"location":"architecture/#memcached","title":"memcached","text":"

    memcache stores progress text message information during login process. memcache datas are set and get only by the control plane.

    "},{"location":"architecture/#ocuser","title":"oc.user","text":"

    oc.user is the name of the user's container image. oc.user runs the X11 graphical service. oc.user is based on ubuntu distribution.

    • The image abcdesktopio/oc.user.ubuntu:3.0 is based on ubuntu distribution 22.04. Get more details about oc.user image.
    "},{"location":"architecture/#applications","title":"applications","text":"

    All applications are containers or pods, and share a graphical socket with the user's container

    "},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"
    • Read the chapter Edit your configuration file in docker mode is mandatory
    • Read the chapter Build abcdesktop docker image is mandatory.
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.

    abcdesktop can run Microsoft Windows applications using Wine.

    "},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded in oc.template.gtk.wine image","text":"

    To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.

    Start pulling this template image, if you don't have already done in the previous exercice :

    docker pull abcdesktopio/oc.template.gtk.wine\n

    This image embeded the architecture format win32 win64. By default the WINEARCH is set to win32. The playonlinux package is all ready installed.

    "},{"location":"buildapplications.wine/#change-the-odconfig-configuration-file","title":"Change the od.config configuration file","text":""},{"location":"buildapplications.wine/#the-homedirectorytype-option","title":"The homedirectorytype option","text":"

    To share the home directory /home/balloonvolume data between containers, set the desktop.homedirectorytype to 'volume' in your od.config file.

    Edit your own od.config file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype is set to 'volume'

    desktop.homedirectorytype: 'volume' \n

    If need, run the docker-compose restart command in your abcdesktop directory where the od.config and the docker-compose.yml are located.

    docker-compose restart\n
    "},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"

    In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.

    PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.

    Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

    In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.

    Login using the Anonymous authentification provider.

    Click on the menu and choose settings options

    On the Settings dialog box, choose System option

    Choose the User container tabs, and select the hostname value.

    Copy this value into your clipboard. The hostname use the docker containerid value.

    Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.

    Run the docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

    CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n

    where CONTAINER_ID is your own containerid value.

    For example

    docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n

    You should read the volume name starting by the prefix tmp- with your uuid value, and a second volume name starting by the prefix home- with your uuid:

    [tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n

    We are using the /tmp volume and the /home/balloon volume of your container.

    If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf. The name of the tmp volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf and the name of tmp volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf

    If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes. The name of the tmp volume is tmp-hermes and the name of tmp volume is home-hermes.

    Replace in the command the string TMP_VOLUMENAME by your own tmp volume name.

    Replace in the command the string HOME_VOLUMENAME by your own home volume name.

    docker run -it -v TMP_VOLUMENAME:/tmp  -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n

    For example with an anonymous user:

    docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n

    Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

    To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n

    Init the wine directory

    wineboot --init\n

    After few seconds you should read on the standard error

    0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

    And now download putty.exe from the web site https://www.putty.org/.

    In this example, we use the 64 bits binary format

    balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n

    Start the putty.exe with wine, with the command wine putty.exe

    balloon@5719b77d3f2a:~$ wine putty.exe\n

    After few seconds you should read on the standard error

    0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n

    The wine prefix is WINEPREFIX=/composer/.wine, all files used by wine are stored in /composer/.wine directory.

    On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :

    You can use this Putty Windows application to connect to another host using ssh or telnet protocol.

    The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell Click on the Web Shell icon, a new Terminal WebShell is now opened :

    Run the command to list each X11 windows and get the WMClass name.

    wmctrl -lx \n

    Read the WM_CLASS of the Putty Wine application: putty.exe.Wine

    Then exit the web shell and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine.

    "},{"location":"buildapplications.wine/#build-the-new-puttyd-image-for-abcdesktop","title":"Build the new putty.d image for abcdesktop","text":"

    In this chapter we are going to build a new docker image for abcdesktop

    The new image is the putty.

    Create a directory named build, and create a directory icons inside build

    mkdir build\nmkdir build/icons\ncd build\n

    To build your own json file.

    Create a json file named applist.json, inside build directory, and add the content to the json file.

    [\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

    To fill the data inside the json file :

    name Type Data cat string utilities icon string putty.svg keyword string putty,ssh,terminal launch string putty.exe.Wine name string putty path string /usr/bin/wine args string /composer/bin/putty.exe template string abcdesktopio/oc.template.gtk.wine

    You can read the following help lines.

    • cat is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
    • icon is the name of the icon. abcdesktop support only svg icon file format. To get the icon file, look at the link https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg
    • keyword is a list of the keywords to find the application. Set the value to putty,ssh,terminal.
    • launch is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below).
    • name is the name of the application. Set the value to putty.
    • path is the binary path to run the application.
    • template is the name of the parent image. The default image parent for wine is abcdesktopio/oc.template.gtk.wine.

    Save the putty icon file on SVG format to the icons directory.

    wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
    "},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json","text":"

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

    Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

    If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

    In the build directory, you should have

    drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   497 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 icons\n-rw-r--r--   1 devuser  staff  6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 putty.svg\n

    Run the command make.js

    node make.js\n

    make.js build a new DockerFile for putty application. Remember, all application images use container images.

    You should get the output

    {\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp', \n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\n

    The new files putty-wine.d has been generated :

    • putty-wine.d is the Dockerfile for your putty abcdesktop application

    Read the content of the Dockerfile putty-wine.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

    Now it's time to build your putty app. Run the command docker build command.

    docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

    You should read on the standard ouput

    [+] Building 21.6s (10/10) FINISHED                                                                                      \n => [internal] load build definition from putty-wine.d                                                              0.0s\n => => transferring dockerfile: 12.46kB                                                                             0.0s\n => [internal] load .dockerignore                                                                                   0.0s\n => => transferring context: 2B                                                                                     0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev                                    0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev                                               0.0s\n => [2/6] RUN wineboot --init                                                                                      10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe             0.6s \n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                9.2s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                0.4s \n => [6/6] WORKDIR /home/balloon                                                                                     0.0s \n => exporting to image                                                                                              0.4s \n => => exporting layers                                                                                             0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd                        0.0s \n => => naming to docker.io/library/putty-wine.d                                                                     0.0s\n

    Now, your new image is ready to run.

    "},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"

    The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.

    Using your web browser or a curl command, call a http request to notify the API Server

    http://localhost/API/manager/buildapplist\n

    This http request return a json object, with all docker images details :

    Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.

    In the search area, type putty. Click on the Putty Application.

    Wine is starting your Putty application :

    Great, you have build a abcdesktop image for Putty, build the application image Putty. You can push this image to your own private docker registry.

    "},{"location":"buildapplications.wine/#optional-add-a-persistant-userreg-and-systemreg-windows-registry-files","title":"Optional add a persistant user.reg and system.reg windows registry files","text":"

    This is a quick and dirty solution, but it works fine

    Your wine configuration is stored in /composer/.wine, and by default user.reg and system.reg are located in the WINEPREFIX directory. The user.reg and system.reg files build when wine starts.

    To make a copy of fresh running putty-wine.d image. Start your putty-wine.d image and using a shell located the new user.reg and system.reg files

    docker ps -a | grep putty-wine\n65d95f4e7717   putty-wine.d:latest                               \"/composer/appli-doc\u2026\"   16 seconds ago   Up 15 seconds                                                                                                    anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n

    Then copy files using the docker cp command

    CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n

    Add them to your default putty-wine.d image using applist.json file :

    [\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

    Rebuild your Dockerfile

    node make.js\n
    {\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp',\n    'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n

    Run the command docker build command.

    docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

    Now your wine keep your registry's updates.

    "},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"

    abcdesktop use docker image format with some labels to describe the application.

    "},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.
    • The root password of the oc.user docker image. The default password is lmdpocpetit, but this value may have been changed.
    "},{"location":"buildapplicationsgnulinux/#build-your-own-application-image_1","title":"Build your own application image","text":"

    In this chapter we are going to build a new docker image for abcdesktop

    The new image is the game 2048.

    Create a directory named build, and create a directory icons inside build

    mkdir build\nmkdir build/icons\ncd build\n

    To build your own image create first a json file.

    Create a json file named applist.json, inside build directory, and add the content to the json file.

    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n]\n

    To fill the data inside the json file :

    name Type Data cat string games debpackage string 2048-qt icon string 2048_logo.svg keyword string 2048 launch string 2048-qt.2048-qt name string 2048 path string /usr/games/2048-qt template string abcdesktopio/oc.template.gtk

    You can read the following help lines, or fill the json missing value by yourself.

    • cat is the category, choose the most appropriate value in the list : [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ]
    • debpackage is the name of the 2048 ubuntu package. To find the package name, look at the link 2048 Ubuntu Package.
    • icon is the name of the icon. abcdesktop support only svg icon file format. To get the icon file, look at the link https://upload.wikimedia.org/wikipedia/commons/1/18/2048_logo.svg
    • keyword is a list of the keywords to find the application. Set the value to 2048.
    • launch is the X11 Class name of the window. To get this value, we need to run the application on GNU/Linux (read the dedicated chapter below).
    • name is the name of the application. Set the value to 2048.
    • path is the binary path to run the application.
    • template is the name of the parent image. The default image parent is abcdesktopio/oc.template.gtk. You will learn how to customize your own template image, in next chapter.

    Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons command :

    2048_logo.svg\n
    "},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

    Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

    If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

    In the build directory, you should have

    drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   265 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 img\n-rw-r--r--   1 devuser  staff  8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 2048_logo.svg\n

    Run the command make.js

    node make.js\n

    make.js build a new DockerFile for the 2048 application. Remember, all application images use container images.

    You should get the output

    {\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n        - '2048'   : '2048.md'\n

    The new files 2048.d and 2048.md have been generated :

    • 2048.d is the Dockerfile for your 2048 abcdesktop application
    • 2048.md is the documentation file for your 2048 abcdesktop application

    Read the content of the Dockerfile 2048.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

    Now it's time to build your 2048 app. Run the command docker build command.

    docker build  --build-arg TAG=latest -f 2048.d -t 2048.d .\n

    You should read the output :

    [+] Building 32.0s (10/10) FINISHED                                                                                                                                                                 \n => [internal] load build definition from 2048.d                                                                                                                                               0.0s\n => => transferring dockerfile: 33B                                                                                                                                                            0.0s\n => [internal] load .dockerignore                                                                                                                                                              0.0s\n => => transferring context: 2B                                                                                                                                                                0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest                                                                                                                 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB                                                                                                 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB                                                                                                 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean                                                           27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                   0.5s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                           0.5s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                           0.4s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                0.0s \n => exporting to image                                                                                                                                                                         1.1s \n => => exporting layers                                                                                                                                                                        1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a                                                                                                   0.0s\n => => naming to docker.io/library/2048.d\n

    Check that your image is ready on your system:

    Run the docker images command

    docker images\n

    You should read on the stdout more lines, only 2048.d is listed here :

    REPOSITORY                           TAG                                                     IMAGE ID       CREATED              SIZE\n2048.d                               latest                                                  a861af06b7f0   About a minute ago   1.17GB\n

    The total image size of 2048.d is 1.17GB.

    The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk.

    "},{"location":"buildapplicationsgnulinux/#update-the-cache-application-list","title":"Update the cache application list","text":"

    The API server receives a new image event from docker. To run the new applications just refresh you web browser page.

    "},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"

    Return to your abcdesktop website http://localhost and log in as Anonymous.

    At the right corner, write in the search bar the keyword 2048

    Click on the 2048 icon, and start your first abcdesktop application :

    Great it's a good job, you have build your own abcdesktop 2048 application.

    Now you can spent a lot of time to reach the 2048 score. Have fun !

    "},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Get launch and path values","text":"

    To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.

    If you want to use abcdesktop as a GNU/Linux host

    Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch and path.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right corner, write in the search bar the keyword shell

    Click on the Web Shell icon, a new Terminal WebShell is now opened :

    Run the command

    sudo apt-get update \n

    The default password is lmdpocpetit ( if your admin did not change it, otherwise ask to the administrator )

    Run the installation command

    sudo apt-get install -y 2048-qt \n

    You should read the output, during the installation process

    On Ubuntu, the games are installed in a dedicated directory /usr/games.

    Read the file list of the 2048-qt Ubuntu package

    /usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n

    Start the 2048 game binary 2048-qt in background.

    /usr/games/2048-qt & \n

    The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.

    Run the command to list each X11 windows and get the WMClass name.

    wmctrl -lx \n

    wmctrl is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.

    • -l list the windows being managed by the window manager.
    • -x include WM_CLASS in the window list

    Great, look at the third value, this is what we are looking for :

    • The launch is 2048-qt.2048-qt
    • The path is /usr/games/2048-qt

    You can now close your web browser and fill your json file, by yourself

    "},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"

    The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.

    By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.

    New applist.json data, and build your own Gimp abcdesktop.io application.

    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"\",\n    \"debpackage\": \"\",\n    \"icon\": \"\",\n    \"keyword\": \"\",\n    \"launch\": \"t\",\n    \"name\": \"\",\n    \"displayname\": \"\",\n    \"path\": \"\",\n    \"template\": \"\"\n  }\n\n]\n

    You should get data entries like:

    • The GIMP icon SVG file is avalaible on wikipedia website The_GIMP_icon_-_gnome.svg
    • The wmctrl show the WM_CLASS gimp.Gimp
    • The path is /usr/bin/gimp
    [\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n\n]\n
    "},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"

    abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.

        \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n

    These entries allow user to use the file manager choice Open with and Open with Other Application

    and list Recommended Applications

    The Gimp Json data shows

    {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n

    Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.

    "},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"

    musl versus glibc

    "},{"location":"changelog/","title":"abcdesktop change log","text":"

    Logs of all notable changes made to abcdesktop.io

    "},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":"
    • to fix issue: https://github.com/abcdesktopio/oc.pyos/issues/2#issuecomment-1607671669 use WEBSOCKIFY_HEARTBEAT in od.config file OR use proxy-read-timeout and proxy-send-timeout annotations to kind: Ingress
    • add --heartbeat=${WEBSOCKIFY_HEARTBEAT} to /usr/bin/websockify to keep session
    • commit https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442
    "},{"location":"changelog/#commits-on-jun-16-2023","title":"Commits on Jun 16, 2023","text":""},{"location":"changelog/#ocuser-ocpyos-change-default-namespace","title":"oc.user, oc.pyos change default namespace","text":"
    • oc.pyos: support namespace change, new option in od.config file to change the default abcdesktop namespace
    • oc.user: support namespace change
    "},{"location":"changelog/#commits-on-jun-9-2023","title":"Commits on Jun 9, 2023","text":""},{"location":"changelog/#ocpyos-clusterrole-and-role","title":"oc.pyos: ClusterRole and role","text":"
    • replace ClusterRole to role
    • create new file for ClusterRole
    • role and ClusterRole are supported
    • commit https://github.com/abcdesktopio/conf/commit/5b27b4c9831197142f0fdb94ca72125bd2db4b7d
    "},{"location":"changelog/#commits-on-may-24-2023","title":"Commits on May 24, 2023","text":""},{"location":"changelog/#add-new-label-role-for-each-core-service","title":"add new label role for each core service","text":"
    • abcdesktop/role
    "},{"location":"changelog/#commits-on-may-17-2023","title":"Commits on May 17, 2023","text":""},{"location":"changelog/#replace-daemonset-by-deployment","title":"Replace daemonset by deployment","text":"

    -- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442

    "},{"location":"faq/","title":"FAQ","text":"

    List of questions and answers relating to abcdesktop.io

    A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.

    "},{"location":"faq/#networking","title":"Networking","text":"

    This list of questions and answers is relating network, talking about

    • port-forward
    • NodePort
    • LoadBalancer
    • Ingress Controler
    • WebSocket timeout
    "},{"location":"faq/#how-can-i-reach-my-new-service-on-a-kubernetes-cloud-provider","title":"How can I reach my new service on a Kubernetes cloud provider ?","text":"

    I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?

    We use the kubectl port-forward to the nginx pod

    NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n

    Then open your web browser to reach the http://localhost

    Then open your web browser, you get the home page, login using LDAP auth or Anonymous auth.

    Then login, and you get a pod user.

    For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.

    "},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"

    I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?

    To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer.

    Delete the previous abcdesktop's nginx service

    kubectl delete service nginx -n abcdesktop\n

    Create a new nginx service yaml file named nginx-lb.yaml The new nginx service type is LoadBalancer

    kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n

    Apply the nginx service type LoadBalancer

    kubectl apply -f nginx-lb.yaml\nservice/nginx created\n

    Wait for an EXTERNAL-IP from you kubernetes cloud provider

    kubectl get service nginx -n abcdesktop\nNAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nnginx   LoadBalancer   10.245.105.75   <pending>     80:31581/TCP   64s\n

    You get the EXTERNAL-IP for your LoadBalancer

    kubectl get service nginx -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      2m36s\n

    In case, the LoadBalancer service returns the EXTERNAL-IP 161.35.246.4 Then open your web browser to reach this EXTERNAL-IP 161.35.246.4.

    Login using Philip J. Fry

    And you should get the fry desktop

    "},{"location":"faq/#how-can-i-expose-my-new-service-with-ingress-controller","title":"How can I expose my new service with Ingress Controller ?","text":"

    A Kubernetes Ingress Controller acts as a reverse proxy.

    In the Ingress, define a path to the abcdesktop's nginx service.

    apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n

    The request path: / is proxyfied to service named nginx in abcdesktop namespace.

    "},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity","title":"How to prevent the connection from closing after 60 seconds of inactivity ?","text":"

    My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.

    The message Your abcdesktop session has been disconnected. Please reload this page appears when the websockify websocket is disconnected.

    Add an heartbeat value to send a ping to the client every INTERVAL seconds

    Edit the od.config file, add to the desktop.envlocal option 'WEBSOCKIFY_HEARTBEAT':'30'

    desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n

    In this case, the command /usr/bin/websockify sends a ping to the client every 30 seconds. This command runs in the user's pod.

    Update the configmap abcdesktop-config

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart the pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    To get more informations how to Keepalive in websockets

    Timeout is a main feature to preserve from unnecessary network bandwidth.

    "},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"

    My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.

    To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.

    Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout and nginx.ingress.kubernetes.io/proxy-send-timeout annotations to more than 60 seconds.

    apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\n  annotations:\n    nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n    nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n
    "},{"location":"faq/#applications","title":"Applications","text":"

    This list of questions and answers is relating abcdesktop's applications, talking about

    • /API/manager/images endpoints
    "},{"location":"faq/#how-to-delete-all-applications","title":"How to delete all applications ?","text":"

    To delete all applications use the images endpoint, replace localhost:30443 by your own datas

    curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n

    It returns a json list of all deleted applications

    [\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
    "},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"

    To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n

    The first start will pull the 2048 image, so it can take a while.

    "},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"

    To get the json file of a containerized application, you can use docker command or crictl command

    • docker command
    docker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
    • crictl command
    crictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
    "},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"

    Open the webshell and read the logs files.

    The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.

    • /tmp/lastcmd.log the init command log file created by /composer/appli-docker-entrypoint.sh
    • /tmp/lastcmdenv.log the last environment variables file
    • /tmp/NAME OF THE APPLICATION.log the command log file for the application
    "},{"location":"guiappsoddocker/","title":"GUI application with containers","text":""},{"location":"guiappsoddocker/#other-related-projets-about-vdi-and-containers","title":"Other related projets about VDI and containers","text":"

    A lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :

    • https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.

    • https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.

    • HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.

    • https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.

    • Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.

    • https://www.kasmweb.com Streaming containerized apps and desktops.

    • Docker and Wine Docker image that includes Wine and Winetricks for running Windows applications on Linux and macOS

    • n.eko This app uses Web RTC to stream a desktop inside of a docker container (doesn't use VNC)
    "},{"location":"guiappsoddocker/#x11-window-system-architecture","title":"X11 window system architecture","text":"

    In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]

    "},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"

    Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.

    We can approach this problem from three angles:

    "},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":"
    • we can bundle X11 server with our container image. All process run inside the same container.
    "},{"location":"guiappsoddocker/#separated-container","title":"Separated container","text":"
    • we can share the X11 server socket with the X11 client container as unix file socket on an external shared volume. Applications and X11 server run in dedicated containers.

    • we can share the X11 server socket with the container using TCP. X11 uses TCP as its transport protocol. Applications and X11 server run in dedicated containers.

    "},{"location":"guiappsoddocker/#abcdesktop-choices","title":"abcdesktop choices","text":"

    To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.

    • The unix file socket reduce the network tcp overhead.

    • The unix file socket garantes no latency troubleshooting. X11 uses a chatty protocol so that the network latency has a large impact when using X11

    Local is best, thus server and application need to run on the same node, if it can.

    "},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remote DISPLAY","text":"

    The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY in a <canvas> HTML element.

    "},{"location":"guiappsoddocker/#replace-x11-server-from-xorg-by-a-xvnc","title":"Replace X11 Server from X.org, by a Xvnc.","text":"

    Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.

    "},{"location":"guiappsoddocker/#convert-vnc-tcp-socket-in-to-a-websocket","title":"Convert VNC TCP socket in to a WebSocket","text":"

    The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :

    • websockify Websockify just translates WebSockets traffic to normal socket traffic. Websockify accepts the WebSockets handshake, parses it, and then begins forwarding traffic between the client and the target in both directions.

    • ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

    "},{"location":"guiappsoddocker/#use-a-vnc-javascript-client","title":"Use a VNC Javascript client","text":"

    The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.

    • noVNC is VNC client JavaScript library. noVNC follows the standard VNC protocol, but unlike other VNC clients it requires WebSockets support.
    "},{"location":"overview/","title":"abcdesktop overview","text":"

    abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.

    "},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"

    An application can run as ephemeral container or as pod.

    "},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":"
    • nginx : container act as static web server and reverse proxy router
    • pyos : container abcdesktop core control plane
    • memcached : container cache service
    • mongo : container database service to store user profil data
    "},{"location":"overview/#abcdesktop-pod-user","title":"abcdesktop pod user","text":"
    • user : pod user, one pod per connected user
    • applications : each graphical application runs inside a dedicated container. You need to create an container image for each application
    "},{"location":"overview/#applications","title":"applications","text":"
    • An application can run as ephemeral container or as pod, it MUST be a container.
    • An application can ask to start another container, like application helper for a web browser. By example, firefox container can ask to start videolan application. Then firefox is running inside a container, videolan is running inside another separated container.
    • abcdesktop manages a mimetype database for each application. The mimetype database is updated on the fly then new application is added.
    • Application resource limit is supported (CPU, memory) on pod.
    • The share memory /dev/shm between X.org and application is supported with the ephemeral container.
    • Application support ACL (Access Control List). Access to an application can be allowed for a user and denied for another one, using group membership for example.
    • Volumes can be mounted for an application or not for security reason.
    • Application can bind a dedicated network by using annotations.
    • Application can use GPU by using labels.
    "},{"location":"rdgp/","title":"Rdgp","text":"

    Privacy Notice: protecting your personal data

    The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.

    If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.

    In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.

    This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.

    This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.

    Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.

    We only process your personal data once we have your consent in the context of you request.

    Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.

    What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.

    Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.

    Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.

    What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.

    How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:

    Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15

    Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.

    How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.

    For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.

    Modification of the personal data protection notice This Privacy Notice is subject to change.

    "},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":"
    • Architecture x86-64 ( arm-64 is not yet available)
    • 15 GB of free space to store sample applications ( gimp, libreoffice writer, libreoffice calc, libreoffice math, libreoffice impress, firefox ) and core image services
    • a kubernetes cluster ready to run greater or equal to 1.24
    "},{"location":"requirements/#release-3x-stable","title":"Release 3.X [ stable ]","text":"
    • Kubernetes release greater or equal to 1.24
    • No depend to dockerd, an application runs as pod or as an ephermeral container
    • Support storageClass and persistent volume claims
    • Support cloud provider
    "},{"location":"requirements/#supported-architectures","title":"Supported Architectures","text":"

    Our images support only architectures x86-64. The architectures supported by this image is:

    Architecture Tag x86-64 amd64-latest

    arm-64 is in progress.

    "},{"location":"requirements/#gnulinux","title":"GNU/Linux","text":"

    The recommended distrubution is Ubuntu 22.04.2 LTS

    "},{"location":"requirements/#macosx","title":"MacOS/X","text":"

    Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

    "},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"

    Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

    "},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":"
    • Read the previous chapter Build abcdesktop docker image
    • Read the Chapter Authentification explicit for LDAP Directory Services is recommended but not mandatory.
    "},{"location":"runapplications.wine/#winehq","title":"WineHQ","text":"

    Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.

    To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50

    Start pulling this template image :

    docker pull abcdesktopio/oc.template.gtk.wine\n

    Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine on the https://hub.docker.com/ web site.

    For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine is created.

    Dockerfile information :

    dpkg --add-architecture i386 aptitude install -y wine

    "},{"location":"runapplications.wine/#run-notepadexe-for-windows-in-a-docker-container","title":"Run notepad.exe for Windows in a Docker container","text":"

    In this chapter we are going to run notepad.exe for Windows inside a docker container for abcdesktop.io.

    Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

    In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.

    Login using the Anonymous authentification provider.

    Keep your web browser open, then on your host, open a terminal shell window and run the command

    docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n

    The option --filter ancestor=abcdesktopio/oc.user.18.04 ask to filter only container with the image ancestor set with value abcdesktopio/oc.user.18.04 You should read the container with the image named abcdesktopio/oc.user.18.04

    docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                                            NAMES\n86df3ff126ac   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   3 minutes ago   Up 3 minutes   4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp  g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n

    Read the values CONTAINER ID and NAMES

    In this example, the CONTAINER ID is 86df3ff126ac and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138.

    We are using the /tmp volume of this CONTAINER ID 86df3ff126ac

    Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be. The name of the tmp volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be

    Run a docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

    docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n

    For example

    docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n

    You should read the volume name starting by tmp- with your uuid concatened

    [tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n

    Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes. The name of the tmp volume is tmp-hermes

    Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"

    docker run -it -v TMP_VOLUMENAME:/tmp  --user balloon abcdesktopio/oc.template.gtk.wine bash\n

    For example with an Anonymous user:

    docker run -it -v  tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n

    Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

    To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n

    And now start the notepad.exe with wine

    balloon@8684ae888f74:/$ wine notepad\n

    After few seconds you should read on the standard error

    balloon@8684ae888f74:/$  wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

    And the notepad window should be open inside your Web browser

    This Windows application is running inside a docker container on abcdesktop.io desktop.

    In the Terminal shell press CTRL+C to stop the wine notepad process, then type exit to quit your shell in container.

    ^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n

    It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.

    "},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"

    The abcdesktop release 1.0 has started in May 2015

    • docker instance version 18 and above.
    • abcdesktop 1.0 (pyos) need a dockerd socket access.
    • Kubernetes release less or equal than 1.23.7-00 (if you use kubernetes release 1.24 or above, you must use abcdesktop release 3.0)
    • abcdesktop release 1.0 is deprecated
    "},{"location":"1.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"1.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"1.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"1.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"1.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"

    The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

    Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.

    "},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

    The authmanagers is defined as a dictionnary object :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    The od.config defines 3 kinds of entries in the authmanagers object :

    • external: use for OAuth 2.0 Authentification
    • explicit: use for LDAP, LDAPS and ActiveDirectory Authentification
    • implicit: use for Anonymous Authentification
    "},{"location":"1.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external OAuth 2.0 Authentification explicit LDAP, LDAPS and Active Directory Authentification implicit Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"

    You should have read the hands-on :

    • Edit your configuration file in docker mode
    "},{"location":"1.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

    Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit, explicit, and external, as describe :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    Save your new od.config file.

    The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.

    docker-compose restart

    Start your web browser and open the URL http://localhost

    The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

    Great you can now add some value to authenticate your users.

    "},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.

    "},{"location":"1.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.

    "},{"location":"1.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

    external is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.

    "},{"location":"1.0/config/authentification/#authmanagers-configuration-sample","title":"Authmanagers configuration sample","text":"

    In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers dictionnary as described for example :

    authmanagers: {\n  'external': {\n    'providers': {\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'client_id':     'XXXXXXX', \n        'client_secret': 'YYYYYYY', \n        'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n        'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n      },\n      'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'client_id':      'AAAAAAAA', \n        'client_secret':  'BBBBBBBB',\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n        'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'mobileorange': { \n        'displayname': 'Mobile Connect', \n        'enabled': False,\n        'client_id':     'CCCCCCCC', \n        'client_secret': 'DDDDDDDD',\n        'basic_auth': True,\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n        'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id':     'EEEEEEEE.apps.googleusercontent.com', \n        'client_secret': 'FFFFFFFF',\n        'scope': 'https://www.googleapis.com/auth/userinfo.email',\n        'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n        'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { 'AD': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                        'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                        'domain'        : 'AD',\n                        'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                             'servers'  : [ '192.168.1.12', '192.168.1.13'  ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                             'query_dcs'    : True\n}}\n
    "},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"1.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

    Providers :

    The provider is formated as a dictionnary

    { 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The ldapconfig is a dictionnary.

    For example :

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.8.195' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
    "},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True ldap_protocol string protocol type. ldap or ldaps for LDAP directory services ldap tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap_protocol is set to ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"

    You should have all read and done the hands-on :

    • Setup abcdesktop.io in docker mode
    • Edit your configuration file in docker mode
    "},{"location":"1.0/config/authexplicit-ldap/#openldap-docker-image-for-testing","title":"OpenLDAP Docker Image for testing","text":"

    To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.

    Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

    "},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"

    Update the docker-compose.yml file to add an ldap as directory server

    The specific openldap section is describe as a service. The new complete docker-compose.yml file is now :

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\n  openldap:\n    image: abcdesktopio/oc.openldap\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
    "},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

    Update the od.config configuration file.

    Add the explicit entry to the dictionary authmanagers.

    authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}\n\n\n

    Note: the config_ref is ldapconfig.

    Add a new dictionnary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'openldap' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n

    Note: the server name is the name of the service entry

    Save your new od.config file.

    The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.

    docker-compose restart

    Open the URL:http://localhost

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"1.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-docker-image-for-testing","title":"The LDAP structure of OpenLDAP Docker Image for testing","text":""},{"location":"1.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"1.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"1.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"1.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"1.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"1.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"1.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"1.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"1.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"1.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"1.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"1.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

    Configuration sample for Microsoft Active Directory

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
    "},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"1.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

    "},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"1.0/config/authexternal/","title":"Authentification external","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"1.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"1.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

    'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
    "},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
    "},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"1.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionnary object and contains an anononymous provider.

    anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anononymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionnary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Press the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command docker ps -a

    docker ps -a\n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When the anonymous container is removed, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

    The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

    By default others controllers access is enabled, without ip restriction.

        controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

    If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"

    Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.

    • In Kubenetes Mode: Read the setup guide, to make change in the abcdesktop yaml file. Setup and configuration guide for kubernetes abcdesktop

    • In Docker Mode : Read the following chapter

    This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.

    "},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • The docker-compose command ready to run
    "},{"location":"1.0/config/editconfig/#download-sample-configuration-file","title":"Download sample configuration file","text":"

    Create a directotry named abcdesktop in your home directory.

    cd\nmkdir -p abcdesktop\n

    To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config where docker-compose.yml file is located.

    Download sample configuration file od.config then rename the od.config.reference file as od.config

    "},{"location":"1.0/config/editconfig/#stop-your-docker-compose","title":"Stop your docker-compose","text":"
     docker-compose down\n

    You should read on the standart output

    Removing open_nginx_1     ... done\nRemoving open_pyos_1      ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1   ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
    "},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml","text":"

    Edit your docker-compose.yml to add a volumes entry to pyos services

    Example : My working directory is /home/alex/abcdesktop

    Add the new entry in volumes

     volumes:\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n

    For example, the docker-compose.yml contains

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
    "},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    Now, it's time to make a change in your od.config file.

    Download the od.config file and save it to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n

    Change the defaultbackgroundcolors in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local oc.config file.

    Run your docker-compose

    To restart your docker-compose, run the command

     docker-compose up\n

    When the od.config change, od.py reload this configuration file automatically.

    You should read at the standard ouput of docker-compose

    Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1   ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1  ... done\nStarting abcdesktop_pyos_1      ... done\nStarting abcdesktop_nginx_1     ... done\n[ lines cut here ]\n
    "},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"

    Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colors and you should have it as background color :

    Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.

    "},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"1.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"1.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"1.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"1.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"1.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"1.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"1.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"1.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"1.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"1.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"1.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"1.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"1.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    {\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite\n
    "},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
    "},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"

    Click on the Docker icon in MacOS/X menu bar.

    Then choose Preferences...

    The following window should appear :

    Choose Kubernetes, then check the Enable Kubernetes

    Kubernetes stay in Starting state during few minutes. Please wait to download all container images and for kubernetes installation process.

    On the bottom you should read next Docker Running Kubernetes Running

    Great, you have installed Kubernetes on MacOS/X.

    "},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

    Open a Terminal, then run the command kubectl version

    % kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

    Run the command kubectl get pods

    % kubectl get pods\nNo resources found.\n

    Great, the kubectl command works. It's time to deploy abcdesktop.io

    "},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"

    Click on the Docker Desktop icon in the windows tray.

    The following menu should appear, choose Settings :

    The following window should appear :

    Choose Kubernetes, then check the Enable Kubernetes

    Press the Apply and Restart button. Please wait to download all container images and for kubernetes installation process.

    On the bottom you should read next Docker Running and Kubernetes Running.

    Great, you have installed Kubernetes on Windows 10.

    "},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

    Open a Terminal cmd.exe, then run the command kubectl version

    Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

    Run the command kubectl get pods

    kubectl get pods\nNo resources found.\n

    Great, the kubectl command works. It's time to deploy abcdesktop.io

    "},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"

    This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.

    Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.

    To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"

    Here are officials available encryption providers (Kubernetes Official page ):

    Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther ConsiderationsidentityNoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbcAES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox.secretboxXSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcmAES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kmsUses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user.

    aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"

    In /etc/kubernetes directory, create a directory named aescbc:

    sudo mkdir /etc/kubernetes/aescbc\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"

    Create aescbc yaml configuration file:

    sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
    apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n  - resources:\n    - secrets\n    providers:\n    - aescbc:\n        keys:\n        - name: key1\n          secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n    - identity: {}\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"

    Secret key can be generated using the following command:

    head -c 32 /dev/urandom | base64\n

    In encrypt_config.yaml, replace secret for key1 in aescbc.keys section

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"

    As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:

    sudo chmod -R 600 /etc/kubernetes/aescbc\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"

    Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"

    Edit kube-apiserver.yaml configuration file:

    vim /etc/kubernetes/manifests/kube-apiserver.yaml\n

    In spec.containers.command section add:

        - --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n

    In spec.containers.volumeMounts section add:

        - mountPath: /etc/kubernetes/aescbc\n      name: aescbc-config\n      readOnly: true\n

    In spec.volumes section add:

      - hostPath:\n      path: /etc/kubernetes/aescbc\n      type: DirectoryOrCreate\n    name: aescbc-config\n

    save the file

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"

    When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:

    kubectl -n kube-system get pods\n
    NAME                             READY   STATUS    RESTARTS   AGE\ncoredns-66bff467f8-69b8r         1/1     Running   0          21h\ncoredns-66bff467f8-74j9n         1/1     Running   0          21h\netcd-cube05                      1/1     Running   0          21h\nkube-apiserver-cube05            1/1     Running   0          6s\nkube-controller-manager-cube05   1/1     Running   1          21h\nkube-flannel-ds-amd64-p9xhq      1/1     Running   0          20h\nkube-proxy-8xk5g                 1/1     Running   0          21h\nkube-scheduler-cube05            1/1     Running   1          21h\n

    At this state, all created secrets will be crypted in etcd

    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"
    kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"
    sudo kubectl -n default describe secret secret1\n
    Name:         secret1\nNamespace:    default\nLabels:       <none>\nAnnotations:  <none>\n\nType:  Opaque\n\nData\n====\nmykey:  6 bytes\n
    "},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"

    To verify secret encryption we will install etcd client package

    apt-get install etcd-client\n

    Run the following command:

    ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n

    Output will appear with the following text k8s:enc:aescbc:v1:key1: followed by binary values.

    Secrets are now encoded with aescbc v1 provider using key1

    "},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • An access to the github website to run git clone command
    • An access to the bintray.com website to download a file

    AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:

    "},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"

    noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.

    "},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"

    noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:

    • Chrome 49, Firefox 44, Safari 11, Opera 36, IE 11, Edge 12
    "},{"location":"1.0/setup/novnc/#features","title":"Features","text":"
    • Supports all modern browsers including mobile (iOS, Android)
    • Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
    • Supports scaling, clipping and resizing the desktop
    • Local cursor rendering
    • Clipboard copy/paste
    • Translations
    • Licensed mainly under the MPL 2.0, see the license document for details
    "},{"location":"1.0/setup/novnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

    Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

    docker volume create myshared \n
    "},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

    Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.

    • The tcp port 6081 will be use later by ws2tcp nodejs server.
    • The volume myshared is mounted to /tmp

    Note: We do not need the default 5900 VNC tcp port any more.

    docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n

    You should see a prompt like :

    root@6de36e574877:/#\n

    Install the package wget Install the library files for tigervnc.

    Package list:

    • libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable

    Those packages are used by tigervnc. We need to install them.

    apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n

    Download the last tigervnc X11 graphics server from the bintray.com web site

     wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n

    Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system

    cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n

    Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section

    Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n

    You should read the output

    Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar  3 11:05:48 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext:      created VNC server for screen 0\n

    Check that the Xvnc TigerVNC release is 1.10.0.

    Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.

    "},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"

    ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.

    ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.

    Before, install the package gcc g++ make curl

    apt-get install -y gcc g++ make curl \n

    Install nodejs and npm

    curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
    apt-get install -y nodejs\n

    Install ws-tcp-bridge

    npm install ws-tcp-bridge -g\n

    Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background

    Add the & at the end of the command line to run this process in background

    /usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n

    You should read on the standard output

    proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n

    Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket

    "},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"

    On the container myx11server, to get the container local IP Address, install the package net-tools package

    apt-get install -y net-tools\n

    And run the ifconfig command

    ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 172.17.0.2 netmask 255.255.0.0  broadcast 172.17.255.255\n        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)\n        RX packets 65149  bytes 95569807 (95.5 MB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 20880  bytes 1159982 (1.1 MB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n

    Write here the ip address of your container myx11server:

    IP Address of myx11server _ . . _ .

    "},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"

    Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.

    docker run -it --name mywebserver -p 80:80 ubuntu:latest\n

    You should see a prompt like:

    root@96df62a73e4f:/# \n

    Install nginx webserver, run the command

    apt-get update\napt-get install -y nginx-extras\n

    Install the git and vim package, run the command

    apt-get install -y git vim\n

    Clone the novnc git on github.com, inside the nginx's root directory.

    cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n

    You should read on the standart output

    Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n

    Start the nginx web server

    nginx\n

    The web server nginx is running in backgound.

    Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.

    "},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"

    Install the ping command, run the command

    apt-get install -y iputils-ping\n

    Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address

    ping -c 5 xxx.xxx.xxx.xxx\n

    In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2

    ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n

    The container webserver should receive package from the myx11server container

    "},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"

    Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.

    vim /etc/nginx/sites-enabled/default\n

    In the server section, after the line location you should found :

        location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n

    Add a /websockify route to proxyfied the websocket http request to your myx11server container.

        location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass                       http://XXX.XXX.XXX.XXX:6081/;\n    }\n

    You have to replace the line

    proxy_pass       http://XXX.XXX.XXX.XXX:6081/;\n

    by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/

    proxy_pass       http://172.17.0.2:6081/;\n

    The complete server section in the nginx file is for example

    server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    # SSL configuration\n    #\n    # listen 443 ssl default_server;\n    # listen [::]:443 ssl default_server;\n    #\n    # Note: You should disable gzip for SSL traffic.\n    # See: https://bugs.debian.org/773332\n    #\n    # Read up on ssl_ciphers to ensure a secure configuration.\n    # See: https://bugs.debian.org/765782\n    #\n    # Self signed certs generated by the ssl-cert package\n    # Don't use them in a production server!\n    #\n    # include snippets/snakeoil.conf;\n\n    root /var/www/html;\n\n    # Add index.php to the list if you are using PHP\n    index index.html index.htm index.nginx-debian.html;\n\n    server_name _;\n\n    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n\n    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass           http://172.17.0.2:6081/; # change this line \n    }\n\n\n    # pass PHP scripts to FastCGI server\n    #\n    #location ~ \\.php$ {\n    #   include snippets/fastcgi-php.conf;\n    #\n    #   # With php-fpm (or other unix sockets):\n    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n    #   # With php-cgi (or other tcp sockets):\n    #   fastcgi_pass 127.0.0.1:9000;\n    #}\n\n    # deny access to .htaccess files, if Apache's document root\n    # concurs with nginx's one\n    #\n    #location ~ /\\.ht {\n    #   deny all;\n    #}\n}\n

    Now, it's time to reload your nginx configuration, by running the command

    nginx -s reload\n
    "},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"

    Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.

    Go to the URL http://localhost or the ip address of your own server

    In this exercice in use localhost in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name of your own server.

    http://localhost\n

    or

    http://YOUR_SERVER_IP_ADDRESS\n

    You should read the Welcome to nginx! message in your web browser

    Go to the noVNC URL http://localhost/noVNC/vnc.html

    http://localhost/noVNC/vnc.html\n

    Remember, remplace localhost by your fully qualified domain name if need

    You should read the Welcome to nginx! message in your web browser

    To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:

    • The Encrypt is not checked
    • Set the Host as localhost (or your host ip address where your contianers are running )
    • Set the Port to 80
    • Set the Path to /websockify

    Then, press the Connect Button

    "},{"location":"1.0/setup/novnc/#install-libreoffice-as-a-docker-application","title":"Install libreoffice as a docker application","text":"

    On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.

    docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install libreoffice application, run the install libreoffice command in your mylibreoffice container.

    apt-get update\napt-get install -y libreoffice\n

    Run the soffice command to start Libreoffice

    export DISPLAY=:0.0\nsoffice --writer\n

    You should read the output

    (soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n

    On the web browser, the application Libreoffice Writer should appear.

    Type some text data like 'Hello, I am running inside a docker container'

    "},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

    To move, resize, close, the windows applications, we need a windows manager. abcdesktop is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

    Run the install openbox command in your myx11server container.

    apt-get install -y openbox\n

    Set the DISPLAY environment variable to :0.0 and start openbox in background

    export DISPLAY=:0.0\nopenbox &\n

    Now, you can move the Libreoffice windows. All windows are decorated.

    Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice

    "},{"location":"1.0/setup/retrieve_all_images/","title":"Get all applications for abcdesktop","text":"

    Lot of application are ready to use for abcdesktop. All applications are opensource.

    You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.

    docker pull abcdesktopio/$APP.d\n

    for example to download libreoffice calc, run the command

    docker pull abcdesktopio/calc.d\n

    Read the list of all applications on the application list page

    "},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"

    Go to the abcdesktop directory (where the docker-compose.yml is located), and run the bash commands :

    echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\"  | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n

    Great, you have uninstalled abcdesktop in non-cluster hosts.

    "},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"

    The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.

    "},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • A VNC Client
    • An access to the docker public registry
    • An access to the ubuntu repository
    "},{"location":"1.0/setup/vnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

    Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

    docker volume create myshared \n
    "},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

    Start the first graphical container named myx11server, forward the tcp port 5900 to the container.

    • The tcp port 5900 will be use later by the vnc server.
    • The volume myshared is mounted to /tmp
    docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n

    You should see a prompt like :

    root@6de36e574877:/#\n

    Install the X11 graphics server tigervnc

    apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n

    Start the X11 graphics server tigervnc

     Xvnc :0 -SecurityTypes=none &\n

    You should read the output

    Xvnc TigerVNC 1.7.0 - built Dec  5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar  2 11:43:56 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on all interface(s), port 5900\n vncext:      created VNC server for screen 0\n

    Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.

    We will use the host tcp port 5900 to connect VNC Client.

    "},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"

    From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/

    Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.

    Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.

    This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue button.

    This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.

    You need to confirm the uncrypted connection warning dialog box. Press the Continue button.

    A black screen should appear :

    Keep this VNC Client running, we will use this display to show our applications later.

    "},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"

    On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.

    docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install standart application like xedit, xman or xeyes, install the package x11-apps.

    Run those commands in your myx11server container.

    apt-get update\napt-get install -y x11-apps\n

    Set the DISPLAY environment variable to :0.0 and then start the xedit command.

    export DISPLAY=:0.0\nxedit\n

    On the VNC Viewer, the application xedit should appear.

    Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.

    "},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

    To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

    Run the install openbox command in your myx11server container.

    apt-get install -y openbox\n

    Set the DISPLAY environment variable to :0.0 and then start openbox.

    export DISPLAY=:0.0\nopenbox\n

    The Openbox message appear to the sdterr

    Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n

    Now, you can move the window xedit. The windows are decorated.

    "},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"

    Activate the window shell with your myapp running container, and press CTRL+C

    root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n

    You can remove your docker container, to clean up your environment

    docker rm myapp\n
    "},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"

    On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.

    docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n

    You should see a prompt like :

    root@96df62a73e4f:/# \n

    To install firefox application, run the install firefox command in your myfirefox container.

    apt-get update\napt-get install -y firefox\n

    Run the firefox command

    export DISPLAY=:0.0\nfirefox\n

    You should read the output

    \n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n

    On the VNC Viewer, the application firefox should appear.

    Check that firefox works and go to your favorite web site.

    "},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"

    To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared

    Run the commands :

    docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n

    Keep the docker images ubuntu, we will use it in the next chapter

    "},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"

    In the next chapter, we will replace the VNC Client by a web browser.

    "},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"

    The abcdesktop release 2.0 has started in May 2020

    • docker instance version 18 and above.
    • abcdesktop (pyos) need a dockerd socket access.
    • Kubernetes release less or equal than 1.23.7-00 (if you use kubernetes release 1.24 or above, you must use abcdesktop release 3.0)
    • an application runs as docker container or as kubernetes pod
    • abcdesktop release 2.x is stable
    "},{"location":"2.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"2.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"2.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"2.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"2.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"2.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

    For example :

    'explicit': {\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description default_domain string set the default domain name, if user does not prefix the login by domain\\s. default_domain is only used by Active Directory provider providers dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref.

    The provider is formatted as a dictionary. Example for a provider defined as planet

     { 'planet': {  \n            'config_ref': 'ldapconfig',  \n            'enabled': True  \n        }\n }\n
    Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet', where key is config_ref and value is the dictionary variable name. enable boolean True to enable or False to disable the provider configuration

    The ldapconfig is a dictionary.

    For example :

    ldapconfig : { \n  'planet': {    \n    'default'       : True, \n    'ldap_timeout'  : 15,\n    'ldap_protocol' : 'ldap',\n    'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://192.168.8.195' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n  } \n } \n}\n
    "},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only boolean Do not run ldap queries, only use to run authentication False auth_type string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap or ldaps for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ] LDAP server address IP Address or FQDN value scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) serviceaccount dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"

    Ldap service account permits service account binding. A service account can be defined using clear text login and password data, or as file reference login and password starting by file://.

    • If login starts by file://, then pyos open the defined file to read login data.
    • If password starts by file://, then pyos open the defined file to read password data.

    The file reference file:// for login and password is used to read kubernetes secret file data.

    "},{"location":"2.0/config/authexplicit-ldap/#configure-auth-using-the-openldap-container","title":"Configure Auth using the OpenLDAP container","text":""},{"location":"2.0/config/authexplicit-ldap/#openldap-container-for-testing","title":"OpenLDAP container for testing","text":"

    To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.

    Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

    "},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

    Update the od.config configuration file.

    Add the explicit entry to the dictionary authmanagers.

    authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}      \n

    Note: the config_ref is ldapconfig.

    Add a new dictionary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

    ldapconfig : { 'planet': {    \n                        'default'       : True, \n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://openldap' ] }}\n

    Save your new od.config file.

    Open the URL:http://localhost:30443

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"2.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-container-for-testing","title":"The LDAP structure of OpenLDAP container for testing","text":""},{"location":"2.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"2.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"2.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"2.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"2.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"2.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"2.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"2.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"2.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"2.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"2.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"2.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

    The explicit provider support the directory services ldap, ldaps, and Microsoft Active Directory, and SIMPLE, NTLM and KERBEROS protocols.

    Configuration sample for Microsoft Active Directory with KERBEROS protocol :

    'explicit': {\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'auth_type'     : 'KERBEROS'\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ 'ldap://192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
    "},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"2.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP explicit authmanagers

    "},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"2.0/config/authexternal/","title":"Authentification external","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"2.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"2.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

    'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
    "},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
    "},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"2.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easiest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionary object and contains an anonymous provider.

    anonymous provider always permits authentification, and create a uuid as userid. anonymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anonymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Select the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command

    kubectl get pods -n abcdesktop \n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When an anonymous user close his session, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"2.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

    The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

    'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

    The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

    A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

    coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

    Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

    For example :

    description: AD\\john\n

    Then pyos look for provider AD configuration and process authentification on domain AD

    The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

    A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

    "},{"location":"2.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

    The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

    authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
    "},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

    metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

    The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

    The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

    To get more information about foreign security principal (FSP), read :

    • Foreign Security Principals Container

    • Active Directory: Foreign Security Principals and Special Identities

    "},{"location":"2.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

    The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

    By default others controllers access is enabled, without ip restriction.

        controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

    If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"

    The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode or in kubernetes mode.

    "},{"location":"2.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

    All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

    Option name Type Sample desktop.usex11unixsocket boolean True desktop.defaultbackgroundcolors list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype string 'volume' desktop.remotehomedirectorytype list [] desktop.persistentvolumeclaim string None desktop.allowPrivilegeEscalation boolean False desktop.securityopt list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret string None desktop.image string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer boolean False desktop.soundimage string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer boolean False desktop.usecontainerimage boolean False desktop.initcontainerimage string 'abcdesktopio/oc.busybox' desktop.envlocal dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' } desktop.nodeselector dictionary {} desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon' desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.host_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] } desktop.application_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] } desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 } desktop.webhookdict dictionary { 'firewall': '192.168.7.1' }"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"

    The desktop.usex11unixsocket force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0

    • If this feature is enable: A container application need a the DISPLAY. The DISPLAY is in this case :0.0. The container application and the oc.user container share the same volume /tmp, and share the X11 unix socket is /tmp/.X11-unix/X0.

    • If this feature is disable: A container application need a DISPLAY. The DISPLAY is :0.0 (don't think at IPADDRESS_OF_X11_SERVER:0.0 to protect X11 access control). The two containers share the same network stack by default. The X11 server NEED to listen to a TCP or UDP port.

    You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.

    TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.

    Set the desktop.usex11unixsocket value to True in most case, and this should not be changed.

    "},{"location":"2.0/config/desktop/#desktopshareipcnamespace","title":"desktop.shareipcnamespace","text":"

    The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application

    Value Description '' Use daemon\u2019s default. 'none' Own private IPC namespace, with /dev/shm not mounted. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system\u2019s IPC namespace.

    If not specified, daemon default is used, which can either be 'private' or 'shareable', depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.

    Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.

    If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".

    Default value desktop.shareipcnamespace : 'shareable'

    "},{"location":"2.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

    This option describes how the default home directory for user user ballon should be created :

    • None: no dedicated volume is created, the oc.user container use a directory inside the container. All user data will be removed at logout.
    • 'volume': This value is only recommended in docker mode. 'volume'option create a dedicated volume, the oc.user container and applications may share this volume. User home data are persistent.
    • 'persistentVolumeClaim': This value is only avalaible in kubernetes. PersistentVolumeClaim option use a persistentVolumeClaim to create the user home directory. The persistentVolumeClaim can be mapped to differents storage data (like NFS, iSCSI, RBD...). Read more about persistentVolumeClaim on the kubernetes.io website. You need the set the value of desktop.persistentvolumeclaim or create a default Persistent Volume Claim named 'abcdesktop-pvc'
    "},{"location":"2.0/config/desktop/#desktoppersistentvolumeclaim","title":"desktop.persistentvolumeclaim","text":"

    This value is only avalaible in kubernetes mode.

    desktop.persistentvolumeclaim is the name of the Persistent Volume Claim if the desktop.homedirectory is set to 'persistentVolumeClaim'. The PVC (Persistent Volume Claim) must exist.

    Run the kubectl get pvc command to list the persistent volume claim

    NAME                                   STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS           AGE\nabcdesktop-pvc                        Bound    abcdesktop-pv             5Gi        RWO            abcdesktop-standard   170d\n
    "},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

    desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

    For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

    If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

    "},{"location":"2.0/config/desktop/#desktopallowprivilegeescalation","title":"desktop.allowPrivilegeEscalation","text":"

    The desktop.allowPrivilegeEscalation option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.

    The default value is False You should only set desktop.allowPrivilegeEscalation to run sudo command.

    In production this value MUST be set to False

    "},{"location":"2.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

    The desktop.defaultbackgroundcolors allow you to change the default background color.

    The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

    The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

    Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

    http://localhost\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    You should see the default background colors, for example :

    "},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"

    The desktop.imagePullSecret is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.

    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with the docker hub.
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with your own privateregistry
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    "},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"

    The desktop.image is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04

    "},{"location":"2.0/config/desktop/#desktopprinterimage","title":"desktop.printerimage","text":"

    The desktop.printerimage is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04

    "},{"location":"2.0/config/desktop/#desktopuseprintercontainer","title":"desktop.useprintercontainer","text":"

    The desktop.useprintercontainer is boolean, to use printer cupsd service as an separated container. This value is only available in kubernetes mode. The default value is False.

    "},{"location":"2.0/config/desktop/#desktopsoundimage","title":"desktop.soundimage","text":"

    The desktop.soundimage is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04

    "},{"location":"2.0/config/desktop/#desktopusesoundcontainer","title":"desktop.usesoundcontainer","text":"

    The desktop.usesoundcontainer is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False.

    "},{"location":"2.0/config/desktop/#desktopuseinitcontainer","title":"desktop.useinitcontainer","text":"

    The desktop.useinitcontainer is boolean, to use init container. The default value is False. The code call the desktop.initcontainercommand list .

    The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.

    /home/balloon must belong to balloon default user and balloon default group.

    "},{"location":"2.0/config/desktop/#desktopinitcontainercommand","title":"desktop.initcontainercommand","text":"

    The desktop.initcontainercommand runs the command at init container. The default value is None, the default type is list.

    desktop.initcontainercommand example :

    desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n

    This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096).

    "},{"location":"2.0/config/desktop/#desktopinitcontainerimage","title":"desktop.initcontainerimage","text":"

    The desktop.initcontainerimage is the name of the init container image. The default value is busybox.

    "},{"location":"2.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

    desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

    The default value is :

    { \n        'DISPLAY': ':0.0', \n        'USER': 'balloon', \n        'LIBOVERLAY_SCROLLBAR': '0',\n        'WINEARCH': 'win32',\n        'UBUNTU_MENUPROXY': '0',\n        'HOME': '/home/balloon',\n        'LOGNAME': 'balloon',\n        'PULSE_SERVER: '/tmp/.pulse.sock', \n        'CUPS_SERVER': '/tmp/.cups.sock' \n}\n

    Add 'CUPS_SERVER: '/tmp/.cups.sock' only if desktop.useprintercontainer is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock' only if desktop.usesoundcontainer is True.

    "},{"location":"2.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

    desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

    { 'disktype': 'ssd' }\n
    "},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"

    desktop.username describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

    desktop.userid describes the uid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

    desktop.groupid describes the gid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    RUN groupadd --gid 4096 $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

    desktop.userhomedirectory describes the homedirectory of the user created inside the oc.user container. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

    Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

    "},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

    The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

    "},{"location":"2.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

    The desktop.policies is a dictionary.

    Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } acl allow or denied desktop creation

    Example

    desktop.policies: { 'rules':\n    { 'volumes': \n        { 'domainuser':  \n            { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n            'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n            } \n        },\n      'acls' : {},\n      'max_app_counter' : 4  }\n
    "},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"

    Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config

    Define how the application can be run, read host_config description page to get more informations

    "},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"

    Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config

    Define how the oc.user container can be run, read host_config description page to get more informations

    "},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

    desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

    "},{"location":"2.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"2.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

    WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

    desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

    Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

    If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

    To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

    kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
    "},{"location":"2.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

    The pyos core service configuration file name is od.config

    "},{"location":"2.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n
    "},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"

    Change the defaultbackgroundcolors option in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local file od.config.

    "},{"location":"2.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

    "},{"location":"2.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
    kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
    "},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

    To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colour and you should have it as background colour :

    Great, you can easily update your configuration file od.config.

    "},{"location":"2.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"2.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"2.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"2.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"2.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"2.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"2.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"2.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"2.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"2.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"2.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"2.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"2.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"2.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"2.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    {\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite\n
    "},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
    "},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"

    The abcdesktop release 3.0 has started in May 2022

    • Kubernetes release greater or equal to 1.24
    • No depend to docker, an application runs as pod or as an ephermeral container
    • All container-runtimes are supported. containerd is recommended by default
    • abcdesktop release 3.x is unstable, API endpoints can change.
    "},{"location":"3.0/features/#architecture-abcdesktop-30","title":"Architecture abcdesktop 3.0","text":"

    In release 3.0, the abcdesktop control plane uses only Kubernetes API. It doesn't depend to dockerd.

    "},{"location":"3.0/features/#auth-service","title":"Auth service","text":"

    Auth service supports LDAP Posix Account

    "},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"

    Application can run as :

    • kubernetes pod
    • kubernetes ephemeral container
    "},{"location":"3.0/features/#volumes","title":"Volumes","text":""},{"location":"3.0/features/#users-home-directories","title":"User's home directories","text":"

    Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath on each worker node or as persistentVolumeClaim. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/","title":"application runtime Ephemeral container and Pod","text":"

    An abcdesktop application can run as a kubernetes ephemeral container or as a pod.

    An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container does not prevent cpu and memory resource limits.

    A pod can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod, you can specify resource limits.

    To describe the difference between ephemeral-container and pod-application, we use the game 2048, one instance come from alpine based on gtk, the second one come from ubuntu based on qt

    • 2048-alpine is a GTK application, and is defined to run as ephemeral-container
    • 2048-ubuntu is a QT application, and is defined to run as a kubernetes pod
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#requirements","title":"Requirements","text":"
    • jq command preinstalled.
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-a-shell-to-your-abcdesktop-server","title":"Start a shell to your abcdesktop server","text":"

    Get a shell to your abcdestkop server.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download 2048-alpine and 2048-ubuntu json files","text":"

    Open a shell to your abcdesktop server

    curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n

    Check that the json files are downloaded

    $ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n

    Look at the label oc.containerengine for each json file

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"
    cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

    The response is ephemeral_container

    ephemeral_container\n

    This application 2048-alpine will start as an ephemeral_container

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine_1","title":"Read the label oc.containerengine for 2048-alpine","text":"
    cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

    The response is pod_application

    pod_application\n

    This application 2048-ubuntu will start as a pod_application, it's a pod.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-and-2048-ubuntu-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine and 2048-ubuntu applications to your abcdesktop service","text":"
    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n

    Each curl command returns a complete json document.

    Wait for the pull pod are Ready

    kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n

    Wait for condition met

    pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

    http://localhost:30443\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"

    Login in as the user Hermes Conrad

    • Login: Hermes Conrad
    • Password: hermes

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created","title":"Your desktop is created","text":"

    Your desktop is created. By default your dock is empty.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"

    In the search text area, write the keyword 2048

    The two applications appear in the search result applications area.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"

    Start 2048-ubuntu and 2048-alpine application

    2048-ubuntu and 2048-alpine applications start. The application 2048-alpine can start quickly than the application 2048-ubuntu.

    • 2048-alpine is an ephemeral container attached to the graphical container.
    • 2048-ubuntu is a complete kubernetes pod.
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#lets-have-a-look-on-your-server-side","title":"Let's have a look on your server side","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#get-pod-application","title":"Get pod application","text":"

    Get the running pod using kubectl get pods -n abcdesktop

    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nhermes-app-2048-ubuntu-4dd6f    1/1     Running   0          8s\nhermes-db906                    4/4     Running   0          100s\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          38m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          38m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          25m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          38m\npyos-od-5586b88767-gsdl8        1/1     Running   0          14m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          38m\n

    The application 2048-ubuntu is listed as a pod. The application 2048-ubuntu is a pod. The prefix is the $userid-app for example hermes-app-2048-ubuntu-4dd6f, followed by the application name 2048-ubuntu and a uuid.

    The application 2048-alpine is not a pod.

    The application 2048-alpine is listed as an ephemeral container, inside the user pod hermes-db906

    kubectl get pods hermes-db906  -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n

    The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses

    [\n  {\n    \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n    \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n    \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n    \"lastState\": {},\n    \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n    \"ready\": false,\n    \"restartCount\": 0,\n    \"state\": {\n      \"terminated\": {\n        \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n        \"exitCode\": 0,\n        \"finishedAt\": \"2023-05-17T14:38:13Z\",\n        \"reason\": \"Completed\",\n        \"startedAt\": \"2023-05-17T14:37:00Z\"\n      }\n    }\n  }\n]\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"

    An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the X11 server.

    A pod can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.

    If your application need to share memory with X11 server, when you have to set the oc.containerengine label to ephemeral_container.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#compare-kubernetes-ephemeral-container-and-pod","title":"Compare kubernetes ephemeral container and pod","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-ephemeral-container","title":"Kubernetes ephemeral container","text":"

    Use an ephemeral container to start an application have some advantages and some disadvantages.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":"
    • Start quickly
    • Less system resources than a pod
    • Share Process Namespace is allowed shareProcessNamespace: true
    • Share memory shm is allowed
    • Share the network stack (IP Address) of the user pod
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages","title":"disadvantages","text":"
    • resources is disallowed
    • no limits and requests (cpu, memory)
    • nodeSelector not supported
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-pod","title":"Kubernetes Pod","text":"

    Use a kubernetes pod to start an application have some advantages and some disadvantages.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":"
    • resources (cpu, memory) is allowed
    • limits and requests are supported
    • ports, livenessProbe, readinessProbe are allowed
    • nodeSelector support an application can run on a dedicated node (for example with GPU)
    • can use a dedicated network to route application data
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages_1","title":"disadvantages","text":"
    • More system resources than an ephemeral container
    • Need X11 tcp port enabled on the user pod 'X11LISTEN': 'tcp'
    • Increase network resource if application pod and user pod run a distinct host
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting","title":"Troubleshooting","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-badshmseg-error","title":"Troubleshooting BadShmSeg error","text":"

    If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"
    curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error applications to your abcdesktop service","text":"
    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n

    Wait for the pulled pod are Ready

    kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n

    Wait for condition met

    pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n

    Login to your abcdesktop service

    Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

    http://localhost:30443\n
    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"

    Login in as the user Hermes Conrad

    • Login: Hermes Conrad
    • Password: hermes

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created_1","title":"Your desktop is created","text":"

    Your desktop is created. By default your dock is empty.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"

    In the search text area, write the keyword 2048

    The three applications appear in the search result applications area.

    Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.

    In the abcdesktop menu, choose Settings |\u00a0Tasks.

    Then select the Logs button. The error was 'BadShmSeg (invalid shared segment parameter)'.

    (org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n

    If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM value to 1.

    QT_X11_NO_MITSHM=1 \n

    Note your can also use QT_XCB_NO_MITSHM value to 1

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-chromium-application","title":"Troubleshooting chromium application","text":"

    For chromium application disabled shm-usage with the parameters --disable-dev-shm-usage

    • disable-dev-shm-usage get more informations about the dev shm usage and all chromium parameters

    • no-sandbox: get more informations about the no-sandbox parameters.

    "},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-cannot-open-display-or-could-not-connect-to-display-error","title":"Troubleshooting cannot open display or could not connect to display error","text":"

    When you start an application the log file write cannot open display error

    kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba  -n abcdesktop \n
    qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n

    Using the web shell inside an abcdesktop session, start netstat -a command line

    The result should show that the process Xvnc is listening on tcp port number 6000

    hermes:~$ netstat  -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      82/Xvnc               \n

    If Xvnc is not listening on tcp port number 6000

    Update od.config to make Xvnc listen on tcp port number 6000

    Open your od.config file, and look at the desktop.envlocal option.

    Add 'X11LISTEN': 'tcp' to the dictionary :

    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n                        'X11LISTEN'             : 'tcp' }\n

    Save your local od.config file.

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Then restart pyos pod

    kubectl delete pod -l run=pyos-od -n abcdesktop\n

    You should read on stdout

    pod \"pyos-od-5586b88767-mrf28\" deleted\n
    "},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":"
    • ctr command preinstalled .
    • nodejs and npm command preinstalled.
    • docker command preinstalled.
    "},{"location":"3.0/application/createsampleapplication/#goals","title":"Goals","text":"
    • Create a sample application xterm. xterm program is a terminal emulator for the X Window System.
    "},{"location":"3.0/application/createsampleapplication/#git-clone-application-repository","title":"git clone application repository","text":"

    The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps

    git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

    And install nodejs packages for oc.apps

    npm install\n
    "},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"

    abcdesktop uses a json file description to build an application.

    Create a sample.json file

    {\n  \"tag\": \"3.0\",\n  \"acl\": { \"permit\": [ \"all\" ] },\n  \"cat\": \"development\",\n  \"icon\": \"small.svg\",\n  \"apkpackage\": \"xterm\",\n  \"keyword\": \"xterm,shell,cmd\",\n  \"launch\": \"xterm.XTerm\",\n  \"name\": \"Xterm\",\n  \"path\": \"/usr/bin/xterm\",\n  \"rules\": { \"homedir\": { \"default\": true } },\n  \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
    "},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile from the sample.json file","text":"

    make.js is a command line for abcdesktop. make.js read a json file and create a Dockerfile

    The make.js options are :

    • -r 3.0 : to build image in abcdesktop 3.0 format
    • -d True : to create a Dockerfile as output
    • -f sample.json: file to read as input

    npm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities

    node make.js -r 3.0 -d True  -f sample.json\n

    Your read on stdout.

    Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n  acl: { permit: [ 'all' ] },\n  cat: 'development',\n  icon: 'small.svg',\n  apkpackage: 'xterm',\n  keyword: 'xterm,shell,cmd',\n  launch: 'xterm.XTerm',\n  name: 'Xterm',\n  path: '/usr/bin/xterm',\n  rules: { homedir: { default: true } },\n  template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n

    Read the Dockerfile

    cat Dockerfile\n
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
    "},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0 from Dockerfile","text":"
    docker build -t abcsample:3.0 .\n
    Sending build context to Docker daemon  44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
    "},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0","text":"

    abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.

    In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.

    Export the image to OCI image format

    docker save abcsample:3.0 -o abcsample.tar\n

    Import abcsample into the namespace k8s.io using ctr

    ctr -n k8s.io images import abcsample.tar\n
    unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
    "},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0 in to abcdesktop","text":"

    Export the abcsample:3.0 image to OCI format

    docker image inspect abcsample:3.0 > abcsample.json\n

    Import the abcsample.json into abcdesktop endpoint /API/manager/image

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n

    Return a json document

    [\n  {\n    \"home\": null,\n    \"cmd\": [\n      \"/composer/appli-docker-entrypoint.sh\"\n    ],\n    \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n    \"id\": \"abcsample:3.0\",\n    \"rules\": {\n      \"homedir\": {\n        \"default\": true\n      }\n    },\n    \"acl\": {\n      \"permit\": [\n        \"all\"\n      ]\n    },\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"Xterm\",\n    \"icon\": \"small.svg\",\n    \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n    \"keyword\": \"xterm,xterm,shell,cmd\",\n    \"uniquerunkey\": null,\n    \"cat\": \"development\",\n    \"args\": null,\n    \"execmode\": null,\n    \"security_opt\": null,\n    \"showinview\": null,\n    \"displayname\": \"Xterm\",\n    \"mimetype\": [],\n    \"path\": \"/usr/bin/xterm\",\n    \"desktopfile\": null,\n    \"executablefilename\": \"xterm\",\n    \"usedefaultapplication\": null,\n    \"fileextensions\": [],\n    \"legacyfileextensions\": [],\n    \"host_config\": {},\n    \"secrets_requirement\": null,\n    \"run_inside_pod\": false,\n    \"image_pull_policy\": \"IfNotPresent\",\n    \"image_pull_secrets\": null\n  }\n]\n
    "},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"

    Open a web browser and go to abcdesktop service url.

    Open a new abcdesktop session.

    Look for your new application xterm

    Start your new application xterm

    The icon of then new application xterm is a green rect. It appears in the dock.

    Logoff to free ressources.

    You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json it describe all json applications for abcdesktop.

    "},{"location":"3.0/application/createsampleapplication/#rebuild-all-images","title":"Rebuild all images","text":"

    To rebuild all application in applist.json, run node make.js -r 3.0

    node make.js -r 3.0\n

    This command has create new '.d' files.

    $ ls *.d\nls *.d\nalpine-2048.d            calculator.d    drawio.d               flare.d          hyper.d       kturtle.d       octave.d        remotedesktopmanager.d  terminal.d     winefile-wine.d  youtube.d\napachedirectorystudio.d  chess.d         edge.d                 frozen-bubble.d  impress.d     leocad.d        onlyoffice.d    rhythmbox.d             terminalpod.d  winemine-wine.d\nastromenace.d            chrome.d        elementary.terminal.d  gcompris.d       inkscape.d    librecad.d      openshift.d     robots.d                tetravex.d     winhelp-wine.d\natom.d                   chromium.d      eog.d                  gedit.d          kalzium.d     mahjongg.d      pinta.d         shotcut.d               thunderbird.d  winscp-wine.d\nbase.d                   citrix.d        evince.d               gelemental.d     kdiamond.d    math.d          planner.d       stellarium.d            ubuntu-2048.d  wireshark.d\nbeekeeperstudio.d        cloudfoundry.d  evolution.d            geogebra.d       kgeography.d  mathwar.d       postman.d       step.d                  vice.d         writer.d\nblender.d                cntlm.d         file-roller.d          gimagereader.d   kigo.d        minecraft.d     putty-unix.d    stress.d                vlc.d          xedit.d\nbless.d                  corsix-th.d     filelight.d            gimp.d           klickety.d    mines.d         putty-wine.d    sublime-text.d          vmmacos.d      xeyes.d\nblobby.d                 dia.d           filezilla.d            gnumeric.d       klotski.d     nautilus.d      qelectrotech.d  supertux2.d             vmrc.d         xman.d\nbrackets.d               doom.d          firefox-esr.d          golly.d          konsole.d     notepad-wine.d  remarkable.d    swell-foop.d            vmubuntu.d     xpad.d\ncalc.d                   draw.d          firefox.d              gretl.d          ksquares.d    notepadqq.d     remmina.d       teams.d                 vscode.d       xterm.d\n

    Each .d file is a Dockerfile

    Run make to build all applications (it can take more than 2 hours)

    make\n
    "},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

    All auth providers support rules configuration

    A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

    "},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

    A rule is a dictionary object with :

    • a name (the entry of the rules)
    • one or more conditions
    • and expected boolean value True or False
    • a label to set if the conditions are equal to the expected boolean value

    Example :

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
    "},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

    conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

    "},{"location":"3.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

    Add the labels 'shipcrewandnet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

    "},{"location":"3.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

    To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

    Add the labels 'noshipcrewandnet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

    To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

     'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

    Add the labels 'shipcrewandnonet80', if the 'expected' value is True

    "},{"location":"3.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"3.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

    This condition is a dummy condition; Only use to force a label or to disable a test.

    'boolean': boolean\n

    The commun usage is

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

    or alway False

    'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
    "},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

    This condition is test if a HTTP Header value is equal to a string.

    'httpheader': dict\n

    example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

    \n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
    "},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"

    This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

    'network': string\n

    example

    To test if the user source IP address is equal to 8.8.8.1/32

    'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

    To test if the user source IP address is in the subnet 10.0.0.0/8

    'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

    To test if the user source IP address is NOT in the subnet 192.168.0.0/24

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

    same as

    'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
    "},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

    To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

    'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
    "},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

    This condition test if the user is a member of a LDAP Distinguished Name.

    'memberOf': string\n
     'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
    "},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

    This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

    'primarygroupid': string\n

    To check is a user is memberof a DOMAIN\\USER the primary group id is 513

    'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

    However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

    'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

    The Enterprise Admins group, 519, is also used to grant this level in POSIX.

    'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
    "},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"

    The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

    Read the Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.

    "},{"location":"3.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

    The authmanagers is defined as a dictionary object :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    The od.config defines four kinds of entries in the authmanagers object :

    • external: use for OAuth 2.0 Authentification
    • explicit: use for LDAP, LDAPS and ActiveDirectory Authentification
    • metaexplicit: use Microsoft Active Directory Trusted relationship, with support of FSP (Foreign Security Principals)
    • implicit: use for Anonymous Authentification and SSL-client certificat
    "},{"location":"3.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external For OAuth 2.0 authentification metaexplicit For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"

    You should have read the hands-on :

    • Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.
    "},{"location":"3.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

    Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit, explicit, and external, as describe :

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

    Save your new od.config file, and restart the pyos pod

    Start your web browser and open the URL http://localhost:30443

    The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

    Great you can now add some value to authenticate your users.

    "},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit is defined to use a directory service like LDAP. Read the authmanagers explicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-metaexplicit","title":"authmanagers metaexplicit:","text":"

    metaexplicit offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.

    "},{"location":"3.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

    external use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.

    "},{"location":"3.0/config/authentification/#authmanagers-sample","title":"authmanagers sample","text":"

    In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.

    You can set a complete authmanagers dictionary as described with external, explicit and implicit

    authmanagers: {\n   'external': {\n    'providers': {\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { \n  'AD': { \n      'default' : True, \n      'ldap_timeout': 15,\n      'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n      'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n      'domain': 'AD',\n      'auth_type': 'KERBEROS',\n      'domain_fqdn': 'AD.DOMAIN.LOCAL',\n      'krb5_conf': '/etc/krb5.conf',\n      'servers'    :  [ 'ldap://192.168.7.12' ],\n      'kerberos_realm': 'AD.DOMAIN.LOCAL',\n      'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n     'auth_protocol' : { \n            'ntlm': True, \n            'cntlm': False, \n            'kerberos': True, \n            'citrix': False, \n            'localaccount': True },\n     'query_dcs' : False } } }\n
    "},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

    Providers :

    The provider is formated as a dictionnary

    { 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The adconfig is a dictionnary. For example :

    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

    If this example, the Microsoft Active Directory value are set to :

    Variable name Value for example USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.local domain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCAL servers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

    The explicit authentification is support LDAP and LDAPS bind.

    The Microsoft Active Directory value are set to :

    Variable name Value USERDOMAIN AD USERDNSDOMAIN AD.DOMAIN.LOCAL

    For Active Directory authmanagers, replace the variable name with your own value.

    Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=local ldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.local domain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCAL servers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ] kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

    The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

    "},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

    This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

    Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') ) site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet) site_attrs list ['cn', 'siteObject', 'location']"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

    This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

    Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn') printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue) site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"3.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

    In this example, ldapconfig dict must have a key LDAP

    Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

    The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

    Providers :

    The provider is formated as a dictionnary

    { 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

    Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

    The ldapconfig is a dictionnary.

    For example :

    ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://192.168.8.195' ],\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
    "},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap server URI starts with ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=com servers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREE timeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=com attrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s)) group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s)) group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"

    The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"3.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

    The basedn is dc=planetexpress,dc=com

    "},{"location":"3.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

    The admin account is described as

    Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":"
    • The User Orgnanistation Unit is ou=people,dc=planetexpress,dc=com
    "},{"location":"3.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"3.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"3.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"3.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"3.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"3.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"3.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"3.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

    Start your web browser and open the URL http://localhost

    The Web home page contains the new input values Login and Password to authenticate this user.

    You can use for example on user of the list above.

    Credentials Value Login Turanga Leela Password leela

    Insert the login credentials :

    Turanga Leela as login and leela as password, then click on the Sign in button.

    Look at the top of the sreen. The user name is Turanga Leela:

    "},{"location":"3.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

    Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

    I like this amazing project abcdesktop.io\n

    Do not save your file and just close your web browser.

    Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

    The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

    All applications are maintained.

    Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

    "},{"location":"3.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

    explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

    The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

    The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

    Configuration sample for Microsoft Active Directory

    For example :

    'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
    adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
    "},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

    If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

    "},{"location":"3.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

    Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

    "},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

    Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

    Great, you have check how the explicit Authentification configuration works.

    "},{"location":"3.0/config/authexternal/","title":"Authentification external","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"

    To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

    "},{"location":"3.0/config/authexternal/#library","title":"Library","text":"

    abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

    "},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

    external authentification use OAuth 2.0 authenticaton.

    The external authentification configuration is defined as a dictionary object and contains a list of external provider.

    Sample providers entry using the Google OAuth 2.0 authentification service.

    'external': {\n    'providers': {\n    'google': { \n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }   \n   }\n}\n

    The variable values client_id and client_secret have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local is referred to your public server FQDN.

    Variable name Type Description Sample displayname string Display Name show in Web front Google enabled boolean LDAP Base Distinguished Names True client_id string client id XXX-YYY.apps.googleusercontent.com client_secret string client secret XXX scope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ] userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauth redirect_uri_querystring string URL query string manager=external&provider=google authorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/auth token_url string token URL https://oauth2.googleapis.com/token

    The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

    "},{"location":"3.0/config/authexternal/#orange-oauth","title":"Orange OAuth","text":"

    Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

    "},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"

    Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

     'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"

    Facebook's OAuth is supported for authentication.

    "},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

    Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

    'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"

    Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

    "},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"

    Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
    "},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"

    GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.

    "},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"

    Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API

    'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"3.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

    implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

    The provider is defined as a dictionnary object and contains an anononymous provider.

    anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

    'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

    anononymous provider always permit authentification, and create a uuid as userid.

    Set in your configuration file the authmanagers dictionnary as described

    authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

    Update your configuration file and apply the new configuration file

    Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

    Press the Sign-In Anonymously button.

    Then, choose the settings in the menu at the upper right corner

    Choose the System in the settings control panel.

    Then choose User containers

    This screen show you the hostname.

    You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

    Using a shell, run the command docker ps -a

    docker ps -a\n

    Find a running container with the containerid previously identified.

    In this example the containerid is f097ab7aac57

    f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

    Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

    For example docker inspect f097ab7aac57

    docker inspect f097ab7aac57\n

    Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

     \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

    When the anonymous container is removed, the anonymous home directory is deleted.

    Great, you have check how the implicit Authentification configuration works.

    "},{"location":"3.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

    The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

    'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
    Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

    The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

    A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

    coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

    Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

    For example :

    description: AD\\john\n

    Then pyos look for provider AD configuration and process authentification on domain AD

    The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

    A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

    "},{"location":"3.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

    The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

    authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
    "},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

    metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

    The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

    The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

    To get more information about foreign security principal (FSP), read :

    • Foreign Security Principals Container

    • Active Directory: Foreign Security Principals and Special Identities

    "},{"location":"3.0/config/balloon/","title":"balloon user entry in od.config","text":"

    balloon is the default generic user.

    The balloon user is created inside the oc.user container

    The default values are

    balloon Default Values name balloon uid 4096 gid 4096 homedirectory /home/balloon

    If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

    ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":"
    • Use cloud provider LoadBalancer service to provide a public ip address using http
    "},{"location":"3.0/config/cloudprovider.loadbalancing/#requirements","title":"Requirements","text":"
    • A kubernetes cloud
    • A cloud provider account
    "},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-http-loadbalancer","title":"Update nginx service to use http LoadBalancer","text":"

    Replace type: NodePortby type: LoadBalancer into the nginx service

    Save this yaml as nginx.service.http.loadbalancer.yaml file name

    kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od \n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n
    # delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new  nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n

    Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service

    kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP      None             <none>        <none>            57m\nmemcached   ClusterIP      10.245.247.50    <none>        11211/TCP         57m\nmongodb     ClusterIP      10.245.198.243   <none>        27017/TCP         57m\nnginx       LoadBalancer   10.245.172.53    <pending>     80:30443/TCP      57m\nopenldap    ClusterIP      10.245.109.131   <none>        389/TCP,636/TCP   57m\npyos        ClusterIP      10.245.94.15     <none>        8000/TCP          57m\nspeedtest   ClusterIP      10.245.67.168    <none>        80/TCP            57m\n

    You get the EXTERNAL-IP for your LoadBalancer service

    kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\ndesktop     ClusterIP      None             <none>         <none>            61m\nmemcached   ClusterIP      10.245.247.50    <none>         11211/TCP         61m\nmongodb     ClusterIP      10.245.198.243   <none>         27017/TCP         61m\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      61m\nopenldap    ClusterIP      10.245.109.131   <none>         389/TCP,636/TCP   61m\npyos        ClusterIP      10.245.94.15     <none>         8000/TCP          61m\nspeedtest   ClusterIP      10.245.67.168    <none>         80/TCP            61m\n

    Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4

    Login using Philip J. Fry

    And you should get the fry desktop

    "},{"location":"3.0/config/cloudprovider.loadbalancing/#troubleshooting-with-port-forward","title":"Troubleshooting with port-forward","text":"

    Use the kubectl port-forward command and a forwarded local port to help troubleshooting issues.

    Get the pod name for nginx

    kubectl get pods -l run=nginx-od -n abcdesktop\nNAME                        READY   STATUS    RESTARTS   AGE\nnginx-od-69fb8fd8bb-qg4z2   1/1     Running   0          11h\n

    Choose the nginx's pod, to forward local port 80 to nginx 80

    kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n

    Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80

    Then open your web browser http://localhost, you should get the home page, login using LDAP auth or Anonymous auth should work.

    Then login, and you get a pod user.

    For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.

    kubectl get pods -n abcdesktop                                                   \nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-bdcbbcb74-nhd68    1/1     Running   0          11h\nmongodb-od-d46d79476-fmbj5      1/1     Running   0          11h\nnginx-od-69fb8fd8bb-qg4z2       1/1     Running   0          11h\nopenldap-od-795c55f6db-wz7l4    1/1     Running   0          11h\npyos-od-988887859-8kwdx         1/1     Running   0          11h\nspeedtest-od-6b5f8584f5-cs69t   1/1     Running   0          11h\nfry-2cf3a                       4/4     Running   0          4m15s\n

    The user fry gets the abcdesktop pod fry-2cf3a

    "},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-loadbalancer-service-with-https","title":"Update nginx service to use LoadBalancer service with https","text":"

    This example works on digitalocean cloud provider.

    First of all, you need to get your loadbalancer-certificate-id

    To list available certificates and their IDs, install doctl and run the command

    doctl compute certificate list\n

    Then define annotations on the abcdesktop nginx service like

      service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n  service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n  service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n

    Create a loadbalancing.yaml file, to update the default abcdestkop service/nginx You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id with your own certificate value.

    ---         \nkind: Service \napiVersion: v1\nmetadata:   \n  name: nginx \n  namespace: abcdesktop\n  annotations:\n    service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n    service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n    service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n  labels:\n    abcdesktop/role: nginx\nspec: \n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 443\n    targetPort: 80\n    name: https\n---\n

    Apply the new loadbalancing.yaml file

    kubectl apply -f loadbalancing.yaml\n

    You can read

    service/nginx configured\n

    Check the nginx/services

    kubectl get service/nginx -n abcdesktop\n
    NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE\nnginx   LoadBalancer   10.245.188.146   161.35.246.4    443:32086/TCP   28m\n

    Now you can replace http by the secure protocol https

    "},{"location":"3.0/config/controllers/","title":"Controllers","text":""},{"location":"3.0/config/controllers/#controllers_1","title":"Controllers","text":"

    abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

    List of all abcdesktop's controllers and the description :

    Controller Description AccountingController accounting data json format AuthController authenticate user ComposerController CRUD main services (like createDesktop, createApplication) CoreController get configuration and user message info ManagerController manage service (like add an application) UserController retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"

    The controllers configuration is a dictionary, and is defined in the pyos's od.config file.

    controllers : { \n    'AccountingController': { \n        'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'ManagerController': { \n        'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'AuthController' :      { 'permitip': None },\n    'ComposerController' :  { 'permitip': None },\n    'CoreController' :      { 'permitip': None },\n    'UserController' :      { 'permitip': None }\n} \n

    By default, AccountingController and ManagerController access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.

    By default, others controllers access is enabled, without any restriction.

    "},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"

    The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller name and with entries permitip and/or apikey.

    • The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or if the controller is not defined, filtering features is disabled.
    • The apikey is a list of string, for example [ 'fPCdPSSj8gZri1Ncmg', 'Z9pXCa2y6ccDeBBeeUc4' ]. If apikey is not set or the controller not defined, filtering features is disabled. The http header value is X-API-Key

    If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden

    {\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
    "},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key","text":"

    Add the http header X-API-Key: fQDbvjCafec4l to the curl command to list images

    curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

    The command returns

    {}\n

    Add the http header X-API-Key: fQDbvjCafec4l to the curl command to add new application

    curl -X POST -H 'X-API-Key: fQDbvjCafec4l'  -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n

    The command returns

    [\n {  \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n    \"path\": \"/usr/bin/xeyes\", \n    \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n    \"id\": \"abcdesktopio/xeyes.d:3.0\", \n    \"rules\": {}, \n    \"acl\": {\"permit\": [\"all\"]}, \n    \"launch\": \"xeyes.XEyes\", \n    \"name\": \"xeyes\", \n    \"icon\": \"circle_xfce4-eyes.svg\", \n    \"keyword\": \"xeyes,eyes\", \n    \"uniquerunkey\": null, \n    \"cat\": \"utilities\", \n    \"args\": null, \n    \"execmode\": null, \n    \"showinview\": null, \n    \"displayname\": \"xeyes\", \n    \"home\": null, \n    \"desktopfile\": null, \n    \"executeclassname\": null, \n    \"executablefilename\": \"xeyes\", \n    \"usedefaultapplication\": false, \n    \"mimetype\": [], \n    \"fileextensions\": [], \n    \"legacyfileextensions\": [], \n    \"secrets_requirement\": null, \n    \"image_pull_policy\": \"IfNotPresent\", \n    \"image_pull_secrets\": null, \n    \"containerengine\": \"ephemeral_container\", \n    \"securitycontext\": {}\n }\n]\n
    "},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"
    curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

    The command returns

    {\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
    "},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"

    The od.config contains options to describe how the oc.user and applications containers have to be created.

    "},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

    All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

    Option name Type Sample desktop.defaultbackgroundcolors list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype string 'hostPath' desktop.remotehomedirectorytype list [] desktop.persistentvolumespec string None desktop.persistentvolumeclaimspec string None desktop.homedirectorytype string 'hostPath' desktop.envlocal dictionary { 'X11LISTEN':'tcp'} desktop.nodeselector dictionary {} desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon' desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 } desktop.webhookdict dictionary {}"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

    This option describes how to create the home directory for the user. The value can be defined as :

    • 'None': no dedicated volume is created, the oc.user container use an emptyDir': { 'medium': 'Memory'}. All user data will be removed at logout.
    • 'hostPath': set a dedicated 'hostPath' volume, the user's container and applications share this volume. User home data are persistent.
    • 'persistentVolumeClaim': set a dedicated 'persistentVolumeClaim' volume, the user's container and applications share this volume. User home data are persistent.

    To get more information about user's home directory volume, read the volumes chapter

    "},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

    desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

    For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

    If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

    "},{"location":"3.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

    The desktop.defaultbackgroundcolors allow you to change the default background color.

    The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

    The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

    Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Connect with Anonymous access, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    You should see the default background colors, for example :

    "},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

    desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

    The default value is :

    { \n  'X11LISTEN': 'tcp'\n}\n
    "},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTEN tcp permit X11 to listen on tcp port, default is udp ABCDESKTOP_RUN_DIR /var/run/desktop directory to write pid services ABCDESKTOP_LOG_DIR /var/log/desktop directory to write log files services DISABLE_REMOTEIP_FILTERING disabled disabled remote ip filtering inside pod user, default is disabled, change to enabled to remove core ip filtering SET_DEFAULT_WALLPAPER myfile.jpeg name of file to set the user wallpaper, this file must exist in ~/.wallpapers SET_DEFAULT_COLOR #6EC6F0 Value of default colour saved in file ~/.store/currentColor SENDCUTTEXT enabled \u00a0Send clipboard changes to user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}. The default value is enabled ACCEPTCUTTEXT enabled \u00a0Accept clipboard updates from user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}. The default value is enabled"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

    desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes.

    It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

    The value must be a string, by example 'true', and matches the labels node value.

    desktop.nodeselector:  { 'abcdesktopworker': 'true' }\n

    To set a label abcdesktopworker=true to a node

    kubectl label node $YOUR_NODE abcdesktopworker=true\n

    The commands returns

    node/nodesample01 labeled\n

    To list all labels on all nodes

    kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n

    The commands returns

    map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n

    desktop.nodeselector is used as selector by pyos to create user's pods and to pull container's images.

    "},{"location":"3.0/config/desktop/#desktopusername","title":"desktop.username","text":"

    desktop.username is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.

    "},{"location":"3.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

    desktop.userid describes the uid Number of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

    "},{"location":"3.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

    desktop.groupid describes the gid Number of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

    "},{"location":"3.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

    desktop.userhomedirectory describes the homedirectory of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

    "},{"location":"3.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

    The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

    "},{"location":"3.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

    desktop.policies has a dictionary format.

    Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } acl allow or denied desktop creation

    Example

    desktop.policies: { \n  'rules': { \n    'volumes': { \n      'domainuser':   { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n      'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n      } \n  },\n  'acls' : {},\n  'max_app_counter' : 4  \n}\n
    "},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

    desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

    "},{"location":"3.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"3.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

    WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

    desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

    Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

    If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

    To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

    kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
    "},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"

    abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.

    For example

    • printer is a service. printer service runs inside the user pod.
    • graphical is a service. graphical service runs inside the user pod and is the default service.
    "},{"location":"3.0/config/desktop.pod/#containers-in-the-user-pod","title":"containers in the user pod","text":"
    • init contains init command for user pod
    • graphical is the user graphical service (X11 and VNC)
    • spawner is the command service for graphical service
    • broadcast is the broadcast service for graphical service
    • webshell is the web socket bash shell service for graphical service
    • printer is the printer service (cupsd)
    • printerfile is the file service to download generated PDF file (this file transfert service is dedicated for printer service)
    • sound is the sound service (pulseaudio) to send rtp stream from a container to the web browser via janus webrtc gateway
    • filer is the filer service to upload and download file into the user home directory
    • storage contains abcdesktop user secrets, like Kerberos, NTLM hashes, VNC password.

    Each service :

    • can be enable or disable 'enable': True
    • can set dedicated 'resources' limits resources for a container
    • can set dedicated 'acl' to start or not using rules
    • can set dedicated 'securityContext' or use the spec securityContext
    • can set dedicated 'secrets_requirement, a list of secrets to run example ['abcdesktop/vnc', 'abcdesktop/kerberos']
    "},{"location":"3.0/config/desktop.pod/#default-desktoppod","title":"default desktop.pod","text":"
    desktop.pod : { \n  'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n  },  \n  'graphical' : { \n    'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'resources': { \n            'requests': { 'memory': \"320Mi\", 'cpu': \"250m\"  }, \n            'limits':   { 'memory': \"1Gi\",   'cpu': \"1000m\" } \n    },\n    'shareProcessNamespace': True,\n    'tcpport': 6081,\n    'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n  },\n  'spawner' : { \n    'enable': True,\n    'tcpport': 29786,\n    'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'broadcast' : { \n    'enable': True,\n    'tcpport': 29784,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'webshell' : { \n    'enable': True,\n    'tcpport': 29781,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printer' : { \n    'image': 'abcdesktopio/oc.cupsd:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 681,\n    # cupsd need to start as root\n    'securityContext': { 'runAsUser': 0 },\n    'resources': { \n      'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" },  \n      'limits'  : { 'memory': \"512Mi\",  'cpu': \"500m\" } \n    },\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printerfile' : { \n    'enable': True,\n    'tcpport': 29782,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'filer' : { \n    'image': 'abcdesktopio/oc.filer:3.0',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'tcpport': 29783,\n    'acl':  { 'permit': [ 'all' ] } \n    },\n  'storage' : { \n    'image': 'k8s.gcr.io/pause:3.8',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"32Mi\",  'cpu': \"100m\" },  \n      'limits'  : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n    }\n  },\n  'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': False,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"8Mi\",  'cpu': \"50m\"  },  \n      'limits'  : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n    } \n  },\n  'init': { \n    'image': 'busybox',\n    'enable': True,\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'imagePullPolicy': 'IfNotPresent',\n    'securityContext': { 'runAsUser': 0 },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n  },\n  'ephemeral_container': {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n     },\n    'acl':  { 'permit': [ 'all' ] }\n  },\n  'pod_application' : {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n    },\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'acl':  { 'permit': [ 'all' ] } } }\n\n
    "},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"

    A container is added to the user pod if 'enable': True

    "},{"location":"3.0/config/desktop.pod/#acl","title":"acl","text":"

    The container is added to the user pod if acl matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.

    "},{"location":"3.0/config/desktop.pod/#pullpolicy","title":"pullpolicy","text":"

    The image use the kubernetes pull policy values :

    • IfNotPresent the image is pulled only if it is not already present locally.
    • Always kubelet queries the container image registry to resolve the name to an image digest.
    • Never the kubelet does not try fetching the image. If the image is somehow already present locally, the kubelet attempts to start the container; otherwise, startup fails.

    Read the pullpolicy kubernetes documentation to get more details.

    "},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"

    waitportbin is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport value.

    The command is run with parameters :

    /composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
    "},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"

    waitportbintimeout is the timeout in seconds to get waitportbin command result.

    "},{"location":"3.0/config/desktop.pod/#image","title":"image","text":"

    Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0')

    "},{"location":"3.0/config/desktop.pod/#imagepullsecrets","title":"imagePullSecrets","text":"

    The imagePullSecret entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.

     imagePullSecret : [ { 'name': name_of_secret } ]\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with the docker hub.
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
    • Example to build a registry Kubernetes secret named abcdesktopregistrysecret with your own privateregistry
    kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n

    The imagePullSecret become in this sample

     imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
    "},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"

    Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.

    "},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"

    spec entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.

    • {{ uidNumber }} is replaced by the user's uidNumber on ldap if the objectClass is posixAccount or if not set by the default user id set in option desktop.userid

    • {{ gidNumber }} is replaced by the user's gidNumber on ldap if the objectClass is posixAccount is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid

    • {{ supplementalGroups }} is replaced by the list of groups gidNumber is posixGroup

    • shareProcessNamespace When process namespace sharing is enabled, processes in a container are visible to all other containers in the same pod. Read the kubernetes shareProcessNamespace details, to get more details.

    • shareProcessMemory Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries. POSIX shared memory requires that a tmpfs be mounted at /dev/shm. Containers in a pod do not share their mount namespaces so we use volumes to provide the same /dev/shm into each container in a pod. Read shared_memory to get more details. Shared memory is defined as an emptyDir volume { 'name': 'shm', { 'medium': 'Memory', 'sizeLimit': shareProcessMemorySize } } minted on /dev/shm. Only ephemeral container application can share memory with the X11 server. To get more details about POSIX and UNIX System V shared memory objects, read the podshmtest repository.

    • shareProcessMemorySize is the size of shareProcessMemory. The size is set to the shm volume 'sizeLimit': shareProcessMemorySize

    'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n
    "},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"

    init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }.

    The command support {{ }} values. Values can be

    • '{{ uidNumber }}'
    • '{{ gidNumber }}'
    • '{{ uid }}'

    Values are read from the previous ldap authentification.

    • '{{ uidNumber }}' is replaced by the ldap uidNumber or if not set by the default user id set in option desktop.userid
    • '{{ gidNumber }}' is replaced by the ldap gidNumber or if not set by the default group id set in option desktop.groupid
    • '{{ uid }}' is replaced by the ldap uid or if not set by the default user name set in option desktop.username

    Example

     'command':  [ 'sh', '-c',  'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
    "},{"location":"3.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

    The pyos core service configuration file name is od.config

    "},{"location":"3.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

    If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

    To make change, edit your own od.config file

    vim od.config \n
    "},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"

    Change the defaultbackgroundcolors option in the desktop options.

    Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

    desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

    Save your local file od.config.

    "},{"location":"3.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

    To apply changes, you can replace the abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

    "},{"location":"3.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
    kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
    "},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

    To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

    http://localhost:30443\n

    You should see the abcdesktop.io home page.

    Press the Sign-in Anonymously, have look

    At the right top corner, click on the menu and choose Settings, then click on Screen Colors

    Choose your colour and you should have it as background colour :

    Great, you can easily update your configuration file od.config.

    "},{"location":"3.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"3.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

    The menu can be changed using the dictionnary object menuconfig

    menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
    "},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

    The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

    docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
    dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
    "},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

    This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

    'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
    "},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"

    host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

    The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

    For example you can set low cpu and memory values to an application like the great X11 xeyes.

    {   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
    "},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove","text":"

    The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

    For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

    By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

    In production this value MUST be set to True

    "},{"location":"3.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_period cpu_quota","text":"

    cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

    cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

    "},{"location":"3.0/config/host_config/#privileged","title":"privileged","text":"

    The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

    "},{"location":"3.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

    The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

    value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

    If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt","text":"

    The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

    • To run without the default seccomp profile seccomp=unconfined
    • To disable sudo command add no-new-privileges to the list. For example: [ 'no-new-privileges', 'seccomp=unconfined' ]

    Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

    Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

    Read security_opt from the docker website.

    "},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_add cap_drop","text":"

    This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

    securityContext:\n      capabilities:\n        desktop.capabilities\n

    For example

        { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

    Permit a container to call ptrace:

    • \"SYS_PTRACE\": Trace arbitrary processes using ptrace
    • \"SYS_ADMIN\": Perform a range of system administration operations.

    Read the docker run command informations Docker run reference

    By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

    Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

    Further reference information is available on the capabilities(7) - Linux man page

    Set this value only to troubleshoot an application.

    In production this value MUST be set to an empty dict {}

    "},{"location":"3.0/config/jira/","title":"JIRA configuration","text":"

    abcdesktop.io support JIRA

    "},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"

    In od.config add the jira option. jira option is a dictionary with the entries :

    entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

    And fill the dictionary

    jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

    Then apply the new configuration file od.config by retrasting the daemon.

    When jira option is set, a new icon issue appears at the top.

    Click on the issue icon, a new window is appear.

    Fill Summary and Your Report values

    Then press the Send button. A notification message appears on the left top corner.

    Log into your jira server, and check your backlog

    Great you added a new issue tracking.

    "},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"

    The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

    "},{"location":"3.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

    The language list must match with the oc.user local packages all ready installed.

    If the language is not found, the default value is set to en_US

    The oc.user.18.04 is built-in with the default language package :

    • language-pack-en
    • language-pack-fr
    apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

    The full supported language list is set by default

    language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

    This list must match with the Accept-Language request HTTP header.

    "},{"location":"3.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

    abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

    Hands-on:

    Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

    "},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

    The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

    "},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

    You can keep the same abcdesktop.io users session, you do not need to logout.

    The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

    Great you have change the language settings of applications running inside an abcdesktop docker container

    "},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

    By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

    Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

    sudo vi /etc/rsyslog.conf\n

    Uncomment the following lines and save file :

    module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

    "},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

    Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

    sudo systemctl restart rsyslog\n

    "},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"

    The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

    logging dict use the python logging module logging module

    The syslog and graylog protocol messaging are supported too.

    The default features for each handlers are :

    handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

    Sub modules used by od.py can log information too.

    Sub module Default Values docker.utils.config { 'level': 'INFO' }, urllib3.connectionpool { 'level': 'ERROR'},

    The logging sample configuration :

    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":"
    • Apply network policies to control traffic flow at the IP address or port level of abcdesktop pods, this includes user's pods.
    "},{"location":"3.0/config/networkpolicy/#authors","title":"Authors","text":"

    jpxavier-oio has designed the network policy for abcdesktop.io

    "},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":"
    • You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes.
    • Network policies are implemented by the network plugin. To use network policies, you must be using a networking solution which supports NetworkPolicy.
    "},{"location":"3.0/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

    There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

    • The NetworkPolicy rights contains egress and ingress for pod selected by tag. rights means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.

    • The NetworkPolicy permits contains egress to a pod selected by tag. The NetworkPolicy permits means permit access to this pod.

    "},{"location":"3.0/config/networkpolicy/#networkpolicy-example","title":"NetworkPolicy example","text":"

    The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.

    "},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicy rights and permits for the memcached.","text":"

    The memcached service is listening on TCP port 11211. The NetworkPolicy for memcached service rights, named memcached-rights, allows pods with label run: memcached-od to expose the TCP port 11211.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      run: memcached-od\n  policyTypes:\n  - Ingress\n  ingress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    from:\n    - podSelector:\n        matchLabels:\n          netpol/memcached: 'true'\n    - namespaceSelector:\n        matchLabels:\n          name: kube-monitor\n      podSelector:\n        matchLabels:\n          netpol/metrics: 'true'\n

    The NetworkPolicy for memcached service permits, named memcached-permits, allows all pods with label netpol/memcached: 'true' to reach the TCP port 11211 to pods with label run: memcached-od.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/memcached: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    to:\n    - podSelector:\n        matchLabels:\n          run: memcached-od\n---\n
    "},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights and permits for the user's pods.","text":"

    The ocuser pod is listening on TCP ports :

    • 4714
    • 6081
    • 29780
    • 29781
    • 29782
    • 29783
    • 29784
    • 29785
    • 29786

    The network policy for ocuser's pods rights is named ocuser-rights. It allows pods with label type: 'x11server' to expose the previous TCP ports.

    The egress network policy allows :

    • dns queries to kube-dns
    • http to any web site
    • https to any web site
    • kerberos auth to any kdc
    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      type: 'x11server'\n  policyTypes:\n  - Ingress\n  - Egress\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          netpol/ocuser: 'true'\n    ports:\n    - protocol: TCP\n      port: 4714\n    - protocol: TCP\n      port: 6081\n    - protocol: TCP\n      port: 8000\n    - protocol: TCP\n      port: 29780\n    - protocol: TCP\n      port: 29781\n    - protocol: TCP\n      port: 29782\n    - protocol: TCP\n      port: 29783\n    - protocol: TCP\n      port: 29784\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n  egress:\n  # pod user can run dns query to all kube-system\n  - ports:\n    - protocol: TCP\n      port: 53\n    - protocol: UDP\n      port: 53\n    to:\n    - namespaceSelector:\n        matchLabels:\n          name: kube-system\n      podSelector:\n        matchLabels:\n          k8s-app: kube-dns\n# permit www website from pod user \n  - ports:\n    - protocol: TCP\n      port: 443\n    - protocol: TCP\n      port: 80\n# permit kerberos auth kinit\n  - ports:\n    - protocol: UDP\n      port: 88\n    - protocol: TCP\n      port: 88\n

    The network policy for ocuser's pods permits is named ocuser-permits. It allows pods with label netpol/ocuser: 'true' to reach the user's pods services.

    apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/ocuser: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - podSelector:\n        matchLabels:\n          type: 'x11server'\n    ports:\n    # default pulseaudio websocket audio without webrtc gateway\n    - protocol: TCP\n      port: 4714\n    # vnc websockify\n    - protocol: TCP\n      port: 6081\n    # reserved\n    - protocol: TCP\n      port: 29780\n    # xterm_tcp_port\n    - protocol: TCP\n      port: 29781\n    # printerfile_service_tcp_port\n    - protocol: TCP\n      port: 29782\n    # file_service_tcp_port\n    - protocol: TCP\n      port: 29783\n    # broadcast_tcp_port \n    - protocol: TCP\n      port: 29784\n    # reserved\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n
    "},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml file","text":"

    To apply the network policies run the command :

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n

    The command returns

    networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
    "},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
    • Login to your abcdesktop
    • Open a webshell and run a curl command.
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    This http request is denied by the network policy and you should get an error message

    You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

    "},{"location":"3.0/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

    To disable the network policies, run the kubectl delete command :

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
    • Login to your abcdesktop
    • Open the web shell to run the same curl command
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    You should get a json document as http response

    {}\n

    You may need to update the netpol-default.yaml file with your own values.

    "},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"

    stack.mode describes how abcdesktop.io can manage user's containers and application.

    • If you run a docker only daemon, set the value to standalone.
    • If you run a kubernetes cluster, set the value to kubernetes.
    stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

    stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

    The default value is abcdesktop.svc.cluster.local

    If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

    If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

    Hostname FQDN mongodb mongodb.abcdesktop.svc.cluster.local memcached memcached.abcdesktop.svc.cluster.local

    The dns resolution need a running core-dnsis the namespace kube-system

    stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

    The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

    For example, by default :

    c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

    "},{"location":"3.0/config/sudo-kubernetes/","title":"Sudo kubernetes","text":""},{"location":"3.0/config/sudo-kubernetes/#how-to-get-a-root-access-inside-a-container-running-kubernetes-abcdesktop","title":"How to get a root access inside a container running kubernetes abcdesktop ?","text":"

    run the sudo command inside the user kubernetes pods

    balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
    "},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"

    In the securityContext add the entry 'allowPrivilegeEscalation': True

    desktop.pod : {\n  'spec'   : {\n    'shareProcessMemorySize': '512Mi',\n    'shareProcessMemory': True,\n    'shareProcessNamespace': True,\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True, \n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'capabilities': { \n        'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n      }\n    }\n  }\n...\n
    "},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"
    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"

    Delete the pyos pod

    kubectl delete pods -l run=pyos-od  -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
    1. Make sure that your user has done a logoff his pod, then login again and run terminal web shell

    The default balloon password is lmdpocpetit

    balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~#  \n

    After the sudo command, you get a root level inside the shell of the users's pod

    In production this value should be set to False

    "},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
       'filters': [ 'odcontext' ],\n

    syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

    syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

    "},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

    Those running linux can simply modify their syslog configuration file following linux syslog config steps

    For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

    docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
    [2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
    "},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

    To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

    "},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

    In handlers entry add the following lines:

            ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

    Replace 192.168.0.52 ip address by your local IP Addresse.

    You can get your local IP address using the following command:

    hostname -I | cut -d ' ' -f1\n
    "},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

    In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

            '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
    "},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
    #              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
    "},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

    To restart Pods, we will delete and recreate all pods

    "},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"

    To delete pods, execute the following command:

    kubectl delete -f abcdesktop.yaml\n
    "},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"

    To create pods, execute the following command:

    kubectl create -f abcdesktop.yaml\n
    "},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

    At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

    tail /var/log/syslog\n

    If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

    "},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume using hostPath. The hostPath can also be a mount point.
    • PersistentVolumeClaim using storageClassName parameter. Two examples are described one using nfs, the second one using s3.
    "},{"location":"3.0/config/volumes/#define-persistentvolume-using-hostpath","title":"Define persistentVolume using hostPath","text":"

    In your od.config file, define the new entries desktop.homedirectorytype desktop.persistentvolumespec desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim'
    • desktop.persistentvolumespec: create a new volume for the user's homeDir, for persistentVolume hostPath.
    • desktop.persistentvolumeclaimspec: create a new volume claim for the user's homeDir
    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n            'storageClassName': '',\n            'capacity': { 'storage': '1Gi' },\n            'accessModes': [ 'ReadWriteOnce' ], \n            'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': '',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'.

    • {{ provider }} is the provider's name templated value.
    • {{ userid }} is the user's id templated value.

    The list of all template values can be read at the end of this chapter

    The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}. The directory is created automatically by kubernetes.

    The /mnt/abcdesktop_volumes/ content lists the provider name.

    On the host, the new directory is created, where each home directory is located.

    Read the new path for 'hostPath' persistent volumes

    ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai   11 11:34 ..\ndrwxr-xr-x   3 root root 4096 mai   12 12:40 anonymous\ndrwxr-xr-x   3 root root 4096 mai   12 12:39 github\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 google\n

    For provider google, all users are listed.

    ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 114102844260599245242\n

    For provider google, list the user home directory for the user 103464335761332102620

    ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\n-rw-------  1 2048 2048   71 mai   12 12:39 .Xauthority\n-rw-rw-r--  1 2048 2048   12 janv. 27 18:36 .Xresources\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .cache\ndrwxr-x---  6 2048 2048 4096 mai   12 12:39 .config\ndrwxrwxr-x  3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r-----  1 2048 2048    0 mai   12 12:39 .gtk-bookmarks\n-rw-rw-r--  1 2048 2048  564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .local\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .store\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .wallpapers\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Desktop\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Documents\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Downloads\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Music\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Pictures\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Public\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Templates\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Videos\n
    "},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rules

    Note: hostPath supports file permissions and the pod's init commands chown or chmod can be used. The hostPath can also be a mount point, using nfs.

    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-storageclassname","title":"Define persistentVolumeClaim using storageClassName","text":"

    To define a persistentVolumeClaim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n

    desktop.persistentvolumeclaimspec is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.

    For example

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'mystorageclass',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    Replace mystorageclass by storageclass of your cloud provider

    kubectl get storageclass\n

    The example output is as follows on the cloud provider aws.

    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n

    The example output is as follows on the cloud provider digitalocean.

    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs","text":"

    In this example, we use nfs to share user home directory with each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.0/config/volumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistentVolumeClaim features.
    • desktop.persistentvolumespec: None to skip the persistent volume provisioning.
    • desktop.persistentvolumeclaimspec create a new volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'nfs-csi-sc-ds01',\n            'resources': { \n              'requests': { \n                'storage': '500Mi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

    Update the new config file and restart pyos pod

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
    "},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.0/config/volumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            Delete           Bound    abcdesktop/planet-fry-9372f   nfs-csi-sc-ds01            3m\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry-9372f   Bound    pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            nfs-csi-sc-ds01   5m7s\n

    Get the PersistentVolumeClaim's description

    kubectl describe pvc planet-fry-9372f -n abcdesktop \nName:          planet-fry-9372f\nNamespace:     abcdesktop\nStorageClass:  nfs-csi-sc-ds01\nStatus:        Bound\nVolume:        pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\n               pv.kubernetes.io/bound-by-controller: yes\n               volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n               volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      25Mi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-87066\nEvents:\n  Type    Reason                 Age              From                                                        Message\n  ----    ------                 ----             ----                                                        -------\n  Normal  ExternalProvisioning   7m (x2 over 7m)  persistentvolume-controller                                 Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n  Normal  Provisioning           7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n  Normal  ProvisioningSucceeded  7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
    "},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"

    Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server

    The user fry has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com

    Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry uidNumber 1049 gidNumber 2049 \u00a0homeDirectory: \u00a0/home/fry

    On the nfs server, define a quota for uid fry. In this case, I use truenas as nfs server.

    Create the fry user with the same attribute and value.

    On the Storage |\u00a0Pools |\u00a0User Quotas, define a quota for the user fry

    Set the quota value for fry

    "},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service_1","title":"Login to your abcdesktop service","text":"

    Delete previous pvc and pv for the fry user, if need.

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the dd commands

    Run a dd command to reach the quota value (50 MiB is this case).

    dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n

    You should get the error Disk quota exceeded. The size of quota-test-file is over a the quota limit.

    50 MB is 52,428,800 Bytes

    ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n

    The user should not be able to create new file

    dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n

    The nfs server has returned an error if the user tries to create more than 50 MiB.

    "},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim using k8s-csi-s3","text":"

    In this example, we use s3 to share user home directory with each worker node

    Use the https://github.com/yandex-cloud/k8s-csi-s3 as a CSI for S3 with minio as backend.

    Follow https://github.com/yandex-cloud/k8s-csi-s3 setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.

    "},{"location":"3.0/config/volumes/#update-storageclassyaml-file","title":"Update storageclass.yaml file","text":"
    ---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n  mounter: geesefs \n  # you can set mount options here, for example limit memory cache size (recommended)\n  options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n  # to use an existing bucket, specify it here:\n  # bucket: abcdesktop\n  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n  csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n

    Update the csi-s3 storage class to add --setuid 0 as options

    kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
    "},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaimspec

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistentVolumeClaim features.
    • desktop.persistentvolumespec: None to skip the persistent volume provisioning.
    • desktop.persistentvolumeclaimspec create a new volume claim for the user's homeDir, the storageClassName csi-s3
    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'csi-s3',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n
    "},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"

    By default the storageclass use mounter: geesefs. geesefs does not store file permissions and the init commands chown or chmod exit with no zero value, then the pod does not start. All files belongs to root, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\".

    Update the 'init' in desktop.pod dict

    'init': { \n    'image': 'busybox',\n    'enable': True,\n    'pullpolicy':  'IfNotPresent',\n    'securityContext': {\n        'runAsUser':   0,\n        'runAsGroup':  0 \n    },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n  }\n

    Apply the new configuration file and restart pyos pods

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to abcdestkop service using your web browser.

    List the persistent volumes

    kubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                             STORAGECLASS               REASON   AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            Delete           Bound    abcdesktop/github-12896316-96cb5                  csi-s3                              2m46s\n

    List the persistent volume claims

    # kubectl get pvc -n abcdesktop\nNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE\ngithub-12896316-96cb5                  Bound    pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            csi-s3                     2m21s\n
    "},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"

    By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

    "},{"location":"3.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

    By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    In terminal webshell run the command :

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
    "},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

    To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

    abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

    pactl -s /tmp/.pulse.sock list short modules\n
    balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

    The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

    The default source is rtp.monitor

    Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

    The default output is

    \nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

    By default, the format is pcm

    Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

    To change the default format update the values in od.config file.

     'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

    To get the 'audiopt' and 'audiortpmap' values, read the web pages

    • meetecho streaming plugin documentation
    • RTP payload formats
    "},{"location":"3.0/config/webrtc/#requirements","title":"Requirements","text":"
    • a janus server
    • add webrtc configuration in od.config file
    "},{"location":"3.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"3.0/config/webrtc/#install-janus","title":"Install janus","text":"

    Install a janus service from meetecho.com on a server

    apt-get install janus\n
    "},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

    Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

    certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
    "},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

    Update the od.config file, for example :

    # WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

    webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

    "},{"location":"3.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

    webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

    The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

    'hostip': '1.2.3.4'\n

    The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

    webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
    "},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

    The http request path is /API/manager

    Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

    buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

    Params Type Description None None None

    example :

    curl http://localhost/API/manager/buildapplist\n

    Return the complete array if json images objects ready to run.

    \n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
    "},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

    example :

    curl http://localhost/API/manager/updateactivedirectorysite

    "},{"location":"3.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

    example :

    curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"

    "},{"location":"3.0/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.0/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04

    "},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"

    Execute command swapoff to disable swap.

    swapoff -a\n

    Load the overlay and br_netfilter kernel modules

    modprobe overlay\nmodprobe br_netfilter\n

    Create the containerd.conf to load modules

    cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io from docker repository","text":"

    Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :

    Install common packages

    apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n

    Add source

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n

    You will be prompted with a Y/n option in order to proceed with the installation.

    apt update\napt install -y containerd.io\n

    containerd.io will then be installed on your system.

    "},{"location":"3.0/setup/k8slinuxinstallation/#step-2-configure-containerdio","title":"Step 2: Configure containerd.io","text":"

    Configure containerd to use systemd as cgroup.

    containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n

    Enable the containerd utility by running the following command :

    systemctl restart containerd\nsystemctl enable containerd\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"

    Run the following command in order to get the Kubernetes signing key:

    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"

    Run the following commands in order to add the Xenial Kubernetes repository:

    echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
    "},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"

    Create kubernetes.conf for sysctl.d

    cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n

    Reload your system sysctl changes

    sysctl --system\n

    Install the packages kubelet kubeadm kubectl

    apt install -y kubelet kubeadm kubectl\n

    K8s utilities will then be installed on your system.

    You can check the version number of kubeadm and also verify the installation through the following command:

     kubeadm version -o yaml\n
    clientVersion:\n  buildDate: \"2022-10-12T10:55:36Z\"\n  compiler: gc\n  gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n  gitTreeState: clean\n  gitVersion: v1.25.3\n  goVersion: go1.19.2\n  major: \"1\"\n  minor: \"25\"\n  platform: linux/amd64\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n

    Option : To use the namespace abcdestkop as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop

    All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n

    Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.

    change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                           TYPE                                  DATA   AGE\ndefault-token-5zknd            kubernetes.io/service-account-token   3      6m6s\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. This container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n

    You should read on the standard output

    clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          59m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          59m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          59m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          59m\npyos-od-5586b88767-6gdtk        1/1     Running   0          59m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          59m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"

    All kubernetes resources can be inspected to get more informations.

    First list elements you want to verify, in the following case, we will inspect pods :

    kubectl get pods -n abcdesktop\n
    NAME                            READY   STATUS             RESTARTS   AGE\nnginx-od-db69c45fb-qnd4n        1/1     Running            0          92s\npyos-od-5586b88767-6gdtk        1/1     Running            0          92s\nmemcached-od-db69c45fb-mqt4n    1/1     Running            0          92s\nmongodb-od-ff874fcb5-sm6f7      1/1     Running            0          92s\nspeedtest-od-55c58fdd69-5znpr   0/1     ImagePullBackOff   0          92s\n

    As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :

    kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop

    In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :

        Events:\n      Type     Reason   Age                    From             Message\n      ----     ------   ----                   ----             -------\n      Warning  Failed   7m6s (x4837 over 18h)  kubelet, cube05  Error: ImagePullBackOff\n      Normal   BackOff  2m9s (x4860 over 18h)  kubelet, cube05  Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n

    As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.

    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"
    kubectl get deployment -n abcdesktop\n

    You should read on the standard output

    NAME           READY   UP-TO-DATE   AVAILABLE   AGE\nmemcached-od   1/1     1            1           10m\nmongodb-od     1/1     1            1           10m\nnginx-od       1/1     1            1           4m26s\nopenldap-od    1/1     1            1           10m\npyos-od        1/1     1            1           3m2s\nspeedtest-od   1/1     1            1           10m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"
    kubectl get services -n abcdesktop\n

    You should read on the standard output

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP   None             <none>        <none>            11m\nmemcached   ClusterIP   10.107.106.62    <none>        11211/TCP         11m\nmongodb     ClusterIP   10.96.113.246    <none>        27017/TCP         11m\nnginx       NodePort    10.100.253.228   <none>        80:30443/TCP      11m\nopenldap    ClusterIP   10.105.69.239    <none>        389/TCP,636/TCP   11m\npyos        ClusterIP   10.98.97.186     <none>        8000/TCP          11m\nspeedtest   ClusterIP   10.109.48.166    <none>        80/TCP            11m\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"

    cluster roles are disable by default

    kubectl describe ClusterRole pyos-role -n abcdesktop\n

    You should read on the standard output

    Name:         pyos-role\nLabels:       <none>\nAnnotations:  <none>\nPolicyRule:\n  Resources                 Non-Resource URLs  Resource Names  Verbs\n  ---------                 -----------------  --------------  -----\n  pods/ephemeralcontainers  []                 []              [create get list watch update patch delete]\n  pods/exec                 []                 []              [create get list watch update patch delete]\n  persistentvolumes         []                 []              [get list create delete]\n  persistentvolumeclaims    []                 []              [get list update create delete]\n  configmaps                []                 []              [get list watch create update patch delete]\n  pods                      []                 []              [get list watch create update patch delete]\n  secrets                   []                 []              [get list watch create update patch delete]\n  events                    []                 []              [get list watch]\n  pods/log                  []                 []              [get list watch]\n  endpoints                 []                 []              [get list]\n  nodes                     []                 []              [get watch list]\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"

    cluster roles Bindind are disable by default

    kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n

    You should read on the standard output

    Name:         pyos-rbac\nLabels:       <none>\nAnnotations:  <none>\nRole:\n  Kind:  ClusterRole\n  Name:  pyos-role\nSubjects:\n  Kind            Name                 Namespace\n  ----            ----                 ---------\n  ServiceAccount  pyos-serviceaccount  abcdesktop\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"
    kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n

    You should read on the standard output

    2023-05-17 13:29:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"

    To rollout restart the abcdesktop deployment

    kubectl rollout restart deployment -n abcdesktop\n

    You should read on the standard output

    deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n

    Check the pods status

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS        RESTARTS   AGE\nmemcached-od-64c56f9458-jcf9x   1/1     Running       0          32s\nmongodb-od-5b5cc9946d-q7fph     1/1     Running       0          32s\nnginx-od-58bdf79df4-skjsn       1/1     Running       0          32s\nopenldap-od-6dcc5d7f8b-g8gvj    1/1     Running       0          32s\npyos-od-784bd7b5c5-tdzxx        1/1     Running       0          32s\nspeedtest-od-5ff99b6579-st9jx   1/1     Running       0          32s\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.0.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST API

    curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"

    This section apply only to configure kubernetes for GNU/Linux.

    abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.

    "},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"

    Linux Requierements

    "},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"

    The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.

    "},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"

    You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.

    swapoff -a\n

    If you have some swaps in /etc/fstab, just comment them out. swapoff -a will disable all swaps temporarily.

    • disable by masking it with sysctl:
    systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
    "},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"

    Run the following command as sudo on the master node:

    kubeadm init --pod-network-cidr=10.244.0.0/16\n

    The process might take a minute or more depending on your internet connection.

    To be able to manage your kubernetes server, you need to run the following commands as a regular user:

    mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
    "},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"

    Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.

    kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n

    It should return the following string.

    node/<your-hostname> untainted\n

    Taints are Kubernetes flags to prevent Pod Scheduling.

    Confirm that you now have a node in your cluster with the following command.

    kubectl get nodes -o wide\n

    It should return something like the following.

    NAME      STATUS     ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nhostname  NotReady   control-plane   3m17s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n
    "},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"

    A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n

    It should return the following strings.

    namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
    "},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"

    Now when you see the status of the nodes, you will see that the master-node is ready :

    kubectl get nodes -o wide\n
    NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nHostname  Ready    control-plane   4m12s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n

    At this step, there is no more Taints and your node is Ready.

    Next step, continue with the setup abcdesktop for kubernetes.

    "},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":"
    • Architecture x86-64 (arm-64 is not yet available)
    • 16 GB of free space to store sample applications (gimp, libreoffice writer, libreoffice calc, libreoffice math, libreoffice impress, firefox) and core image services.
    "},{"location":"3.0/setup/requirements/#release-3x","title":"Release 3.x","text":"
    • kubernetes release must be greater or equal to 1.24
    $ kubectl version --output=yaml\n
    serverVersion:\n  buildDate: \"2022-05-24T12:18:48Z\"\n  compiler: gc\n  gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n  gitTreeState: clean\n  gitVersion: v1.24.1\n  goVersion: go1.18.2\n  major: \"1\"\n  minor: \"24\"\n  platform: linux/amd64\n
    • You do not need to install dockerd.
    • There is no depend to dockerd anymore. In this release and all next releases, application can run as :
    • kubernetes pod
    • ephemeral container. Read more informations about on ephermeral container
    • All container-runtimes are supported. containerd is recommended py default.
    "},{"location":"3.0/setup/requirements/#microk8s-support","title":"microk8s support","text":"

    microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.

    "},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"
    • kubernetes release must be greater or equal to 1.24
    $ microk8s kubectl version --output=yaml\nclientVersion:\n  buildDate: \"2022-09-28T14:42:45Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n  buildDate: \"2022-09-28T14:40:13Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\n
    "},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns add one to microk8s","text":"
    $ microk8s enable dns\n

    You should ready on stdout

    $ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n

    Check microk8s status

    $ microk8s status\nmicrok8s is running\nhigh-availability: no\n  datastore master nodes: 127.0.0.1:19001\n  datastore standby nodes: none\naddons:\n  enabled:\n    dns                  # (core) CoreDNS\n    ha-cluster           # (core) Configure high availability on the current node\n
    "},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"

    images support only architectures x86-64. The architectures supported by this image is:

    Architecture Tag x86-64 amd64-latest"},{"location":"3.0/setup/requirements/#gnulinux","title":"GNU/Linux","text":"

    The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)

    "},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

    The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
    kubectl logs -l run=nginx-od -n abcdesktop\n
    "},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
    running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

    Nginx has failed to start. There is an error in the configuration file.

    We need to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n

    Check that nginx pod has been updated and that the status is Running

    kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

    Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

    Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

    kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

    Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

    nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

    It's time to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

    The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
    kubectl logs -l run=pyos-od -n abcdesktop\n
    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    It's time to fix the abcdesktop-config ConfigMap.

    "},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n

    Check that pyos pod is Running

    kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

    Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

    Run the command cd /var/pyos && ./od.py

    kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

    od.py command returns the same explicit error, the od.config file is wrong.

    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    We need to fix the abcdesktop-config ConfigMap in the yaml file.

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.0.sh bash script using a curl or run step by step uninstall commands manually.

    "},{"location":"3.0/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n

    You should read on stdout

    starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
    "},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"

    Run the bash commands from the uninstall-3.0.sh main content :

    echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n

    The last command kubectl delete namespace can take few minutes.

    Please wait for the output message:

    abcdesktop is uninstalled\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume
    • PersistentVolumeClaim

    In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

    • abcdestkop has a Persistent Volume Claim support.

    Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

    "},{"location":"3.1/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

    Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

    - apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

    Update the default pyos role to ClusterRole

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    "},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

    To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
    "},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

    To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

    desktop.homedirectorytype: 'persistentVolumeClaim'\n
    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

    desktop.persistentvolume is optional and can be set to None, else the type of desktop.persistentvolume parameter must be a dict (dictionary).

    If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

    If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume.

    If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

    The type of desktop.persistentvolumeclaim is dictionary or a string.

    If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a str.

    Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

    if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

    Get more information about PersistentVolume and PersistentVolumeClaim.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

    All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

    Create a persistent volume

    kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
    kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

    Create a persistent volume claim

    kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
    kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

    In the od.config file, set the values

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

    If you need to use subPath

    desktop.persistentvolumeclaimforcesubpath: True\n

    'subPath' is not supported for ephemeral container.

    "},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

    in od.config file

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

    Replace mystorageclass by storageclass of your cloud provider.

    To list the storage classes

    kubectl get storageclass\n
    • The example output is as follows on the cloud provider aws.
    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
    • The example output is as follows on the cloud provider digitalocean.
    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

    Value defines inside {{ VALUE }} is replaced by the templated value keys:

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

    The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

    desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    The variables persistentvolumeclaim and persistentvolume become

    desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
    "},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

    During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

    The default value for desktop.removepersistentvolume is False.

    "},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

    During the remove desktop process, delete or not the persistent volume claim.

    The default value for desktop.removepersistentvolumeclaim is False.

    "},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

    In this example, we use nfs protocol to share user home directory on each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.1/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaim

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistent volume claim features.
    • desktop.persistentvolume: create a new persistent volume.
    • desktop.persistentvolumeclaim create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

    Update the new config file and restart pyos pods. Update the pyos role to allow

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    abcdesktop creates PV and PVC for you.

    "},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.1/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

    Get the persistent volume claim's description

    kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

    Get the persistent volume description

    kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
    "},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

    Update od.config file with the options

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

    Update the configmap

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to your abcdesktop service, you should read on the html page, the status

    b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

    Read the new pod for fry the user fry

    kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

    Read the pvc for fry

    kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

    Read the pv for fry

    kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
    "},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

    When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

    kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
    kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
    kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
    "},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

    Clone kube-tools and run km --apply as root.

    git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

    kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

    Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    "},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.1.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n

    Run install-3.1.sh

    ./install-3.1.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.1.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.1 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.1 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

    The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
    kubectl logs -l run=nginx-od -n abcdesktop\n
    "},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
    running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

    Nginx has failed to start. There is an error in the configuration file.

    We need to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n

    Check that nginx pod is Running

    kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

    Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

    Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

    kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

    Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

    nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

    It's time to fix the nginx-config ConfigMap in the yaml file.

    "},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
    kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

    The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

    "},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
    kubectl logs -l run=pyos-od -n abcdesktop\n
    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    It's time to fix the abcdesktop-config ConfigMap.

    "},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

    If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

    Update the container description to replace the default command by a sleep command

          - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

    The container will start the command /usr/bin/sleep for 1d (one day).

    A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n

    Check that pyos pod is Running

    kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

    Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

    Run the command cd /var/pyos && ./od.py

    kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

    od.py command returns the same explicit error, the od.config file is wrong.

    2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

    We need to fix the abcdesktop-config ConfigMap in the yaml file.

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    "},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.A.sh bash script using a curl.

    "},{"location":"3.1/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n

    Run the uninstall-3.1.sh command line with your own namespace

    ./uninstall-3.1.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

    To retain user's home directory files, you can define

    • PersistentVolume
    • PersistentVolumeClaim

    In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

    • abcdestkop has a Persistent Volume Claim support.

    Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

    "},{"location":"3.2/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

    Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

    - apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

    Update the default pyos role to ClusterRole

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    "},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

    To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
    "},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

    To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

    desktop.homedirectorytype: 'persistentVolumeClaim'\n
    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

    desktop.persistentvolume is optional, the default value is None. desktop.persistentvolume can be None, or a string or a dict.

    If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

    If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.

    If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume. The dict values of persistent volume support template values.

    For example :

    desktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

    desktop.persistentvolumeclaim is optional, the default value is None. The type of desktop.persistentvolumeclaim can be None, or a string or a dict.

    If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a string.

    Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

    if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

    Get more information about PersistentVolume and PersistentVolumeClaim.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

    All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

    Create a persistent volume

    kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
    kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

    Create a persistent volume claim

    kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
    kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

    In the od.config file, set the values

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

    If you need to use subPath

    desktop.persistentvolumeclaimforcesubpath: True\n

    'subPath' is not supported for ephemeral container.

    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

    in od.config file

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

    Replace mystorageclass by storageclass of your cloud provider.

    To list the storage classes

    kubectl get storageclass\n
    • The example output is as follows on the cloud provider aws.
    NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
    • The example output is as follows on the cloud provider digitalocean.
    NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
    "},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

    Value defines inside {{ VALUE }} is replaced by the templated value keys:

    The template values can be one of them :

    var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

    The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

    desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

    The variables persistentvolumeclaim and persistentvolume become

    desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
    "},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

    During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

    The default value for desktop.removepersistentvolume is False.

    "},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

    During the remove desktop process, delete or not the persistent volume claim.

    The default value for desktop.removepersistentvolumeclaim is False.

    "},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

    In this example, we use nfs protocol to share user home directory on each worker node

    Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

    "},{"location":"3.2/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

    On the nfs server, create an export with the no_root_squash option

    For example export /volume1/pods

    /volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
    "},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

    Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

    curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

    Create a storage class file nfs-csi-sc-ds01.yaml,

    • replace server: 192.168.7.101 by your own nfs server ip address
    • replace share: /volume1/pods by your own share

    Content of the default nfs-csi-sc-ds01.yaml

    apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
    kubectl apply -f nfs-csi-sc-ds01.yaml\n

    You read the response on stdout

    storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

    Check the storage class nfs-csi-sc-ds01

    kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
    "},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

    In your od.config file, define the entry desktop.persistentvolumeclaim

    • desktop.homedirectorytype: 'persistentVolumeClaim' to use the persistent volume claim features.
    • desktop.persistentvolume: create a new persistent volume.
    • desktop.persistentvolumeclaim create a new persistent volume claim for the user's homeDir, the storageClassName nfs-csi-sc-ds01

    The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

    # set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

    Update the new config file and restart pyos pods. Update the pyos role to allow

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

    abcdesktop creates PV and PVC for you.

    "},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Login as user (Philip J. Fry, fry)

    The new desktop for Philip J. Fry is created.

    Start the web shell command using the search bar

    Using the web shell application start the df command

    The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

    "},{"location":"3.2/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

    List the new PersistentVolume

    kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

    List the new PersistentVolumeClaim

    kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

    Get the persistent volume claim's description

    kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

    Get the persistent volume description

    kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
    "},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

    Update od.config file with the options

    desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

    Update the configmap

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

    Restart pyos pod

    kubectl delete pods -l run=pyos-od -n abcdesktop\n

    Login to your abcdesktop service, you should read on the html page, the status

    b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

    Read the new pod for fry the user fry

    kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

    Read the pvc for fry

    kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

    Read the pv for fry

    kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
    "},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath","text":"

    desktop.persistentvolumeclaimforcesubpath is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath is False

    If desktop.persistentvolumeclaimforcesubpath is set to True then persistentvolumeclaim is mounted with the subPath option.

    Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath to True.

    If you try to start an ephemeral container application, you get an error code 422 and the message

    { \n    \"reason\":\"FieldValueForbidden\",\n    \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n    \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
    "},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath option","text":"

    In this case :

    • User's home directory are hosted on a nfs server
    • The nfs server (192.168.7.101) exports /volume1/home
    • The nfs server allows user to access subfolders

    We create the unique PersistentVolume named pv-nfs.

    ---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  annotations:\n    pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n  name: pv-nfs\nspec:\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadWriteMany\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: nfs-csi\n  mountOptions:\n    - nfsvers=3\n  csi:\n    driver: nfs.csi.k8s.io\n    readOnly: false\n    # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n    # make sure this value is unique for every share in the cluster\n    volumeHandle: nfs-server.default.svc.cluster.local/share##\n    volumeAttributes:\n      server: 192.168.7.101\n      share: /volume1/home\n---\n

    accessModes is ReadWriteMany for the PersistentVolume

    We create the unique PersistentVolumeClaim named pvc-nfs-homedir

    ---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: pvc-nfs-homedir\n  namespace: abcdesktop\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 10Gi\n  volumeName: pv-nfs\n  storageClassName: nfs-csi\n---\n

    accessModes is ReadWriteMany for the PersistentVolumeClaim

    We define in od.config file

    desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n

    All pods share the same PersistentVolumeClaim named pvc-nfs-homedir, the desktop.persistentvolumeclaimforcesubpath is set to True, the subPath value is set with the default of the current LDAP userid. So the user's home directory is /volume1/home/{{ userid }}. The nfs server allows user to access subfolders, the mount operation is permitted.

    "},{"location":"3.2/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.2/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

    When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

    kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
    kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
    kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
    "},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"

    Play sound from a container to web browser using WebRTC

    "},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":"
    • Read the introduction to WebRTC protocols

    • You need a STUN server. You can use any STUN server like stun.l.google.com:19302. Session Traversal Utilities for NAT (STUN) is a protocol to discover your public address and determine any restrictions in your router that would prevent a direct connection with a peer.

    • You need your own TURN server. We use COTURN server as describe in this chapter. Traversal Using Relays around NAT (TURN) is meant to bypass the Symmetric NAT restriction by opening a connection with a TURN server and relaying all information through that server.

    "},{"location":"3.2/config/webrtc/#webrtc-design","title":"WebRTC design","text":"

    abcdesktop/pulseaudio:3.2 container executes the following services

    • WebRTC Signalling service
    • WebRTC gstreamer webrtcbin
    • Pulseaudio service
    "},{"location":"3.2/config/webrtc/#stun-server","title":"STUN server","text":"

    STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.

    The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good

    { 'urls': 'stun:stun.l.google.com:19302' }\n
    "},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"

    The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.

    You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.

    "},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"

    coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.

    • Coturn installation
    apt-get install coturn \n
    • use SSL certificates

    You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.

    • Minimal COTURN configuration file

    Default minimal configuration file /etc/turnserver.conf for abcdesktop.

    listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n

    Update the following configuration file with you own values

    • static-auth-secret
    • server-name
    • realm
    • cert
    • pkey

    Then start your turn service.

    "},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmap od.config file","text":"

    Add new webrtc's entries

    • Set webrtc.enable to True
    • define webrtc.rtc_configuration dictionary for the web browser webrtc stack
    • define webrtc.coturn dictionnay entries for the web browser webrtc stack
    • coturn_static_auth_secret is the static-auth-secret value define in turnserver.conf file
    • ttl define the time to live for the auth value
    • protocol define the Traversal Using Relays around NAT protocol, value can be turn or turns
    • url url for the coturn service
    webrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n  'coturn_static_auth_secret': 'CHANGEME', \n  'ttl':3600,\n  'protocol': 'turns',\n  'url': 'turn.domain.local:3478' }\n

    pyos merges a new rtc_configuration json document from the webrtc.coturn and from webrtc.coturn values.

    pyos adds username and credential entries. For example, a new rtc_configuration json document is send to the web browser

    {\n  \"iceServers\": [\n    { \"urls\": \"stun:stun.l.google.com:19302\" },\n    { \"urls\": \"turns:nturns.domain.local:3478\",\n      \"username\": \"1703086872\",\n      \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n  ]\n}\n
    • Update the default environment variable desktop.envlocal to add STUN_SERVER

    STUN_SERVER value is used by the gstreamer webrtcbin

    desktop.envlocal :  { \n  'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n
    • Update the sound entry in desktop.pod to enable pulseaudio service

    Update the value 'enable': False to 'enable': True

    desktop.pod : \n\n    ...[CUT HERE ]...\n\n'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.2',\n    'pullpolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n        'requests': { 'memory': \"8Mi\", 'cpu': \"50m\"  },  \n        'limits'  : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n    } },\n\n    ...[CUT HERE ]...\n\n
    • Apply the new configmap abcdesktop-config for the od.config file
    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
    • Restart pyos pod instance
    kubectl delete pods -l run=pyos-od -n abcdesktop\n
    "},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"

    Open your web browser, and go to your abcdesktop web site.

    Make sure to use secured https protocol, else WebRTC is disabled.

    "},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"

    Login using credentials, for example

    The sound is not yet available

    "},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"

    Few seconds later, sound becomes available.

    The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.

    "},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"

    Open a Terminal Web Shell application and run the command inside the web shell

    paplay /usr/share/sounds/alsa/Rear_Center.wav \n

    You should heard Rear Center on your local sound device

    "},{"location":"3.2/config/webrtc/#test-microphone-access","title":"Test microphone access","text":"

    Open a Terminal Web Shell application and run the command inside the web shell

    pavumeter --record\n

    You should see cursor changes if you talk to your abcdesktop

    "},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"

    Open the web browser's console log to read the WebRTC messages

    Read the json rtc_configuration document created by pyos pod

    Read the step Created peer connection for call and creating SDP and step Exchange from foundation for 1 to 6

    Read the step Exchange from foundation from 6 to 9

    Read the step Local stream answer

    The last line is ICE Candidate was null, done

    The sound is now enabled

    "},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

    To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

    "},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

    These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

    Clone kube-tools and run km --apply as root.

    git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

    kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

    Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

    abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

    The abcdesktop infrastructure is using the contianers :

    Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n

    Run install-3.2.sh

    ./install-3.2.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

    Create a pod user to make sure that Kubernetes will find the docker images at startup time.

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n

    You should read on stdout

    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

    You can wait for user pod is Ready, this while take a while, for container images are downloading.

    kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
    pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

    You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.2.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.2.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-x89kq   1/1     Running   0          11s\nmongodb-od-77c945467d-c5cw4     1/1     Running   0          11s\nnginx-od-86c5dfcc67-nfvbq       1/1     Running   0          11s\nopenldap-od-5bbdd75864-mzzmh    1/1     Running   0          11s\npyos-od-7646bf4786-c2hdm        1/1     Running   0          11s\nspeedtest-od-7f5484966f-6t4b2   1/1     Running   0          11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.2.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1 -OutFile install-3.2.ps1\n

    Run install-3.2.ps1

    .\\install-3.2.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-98t4t   1/1     Running   0          23s\nmongodb-od-77c945467d-v4k58     1/1     Running   0          23s\nnginx-od-7c7bf5bf48-khtvg       1/1     Running   0          23s\nopenldap-od-56b6564c85-t56tj    1/1     Running   0          21s\npyos-od-644c98bcd5-8gqzd        1/1     Running   0          23s\nspeedtest-od-894b7c886-fgt6v    1/1     Running   0          23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.2.sh bash script using a curl.

    "},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n

    Run the uninstall-3.2.sh command line with your own namespace

    ./uninstall-3.2.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n

    Run the uninstall-3.2.ps1 command line with your own namespace

    .\\uninstall-3.2.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.3/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.3/config/networkpolicy/#goals","title":"Goals","text":"
    • Apply network policies to control traffic flow at the IP address or port level of abcdesktop pods, this includes user's pods.
    "},{"location":"3.3/config/networkpolicy/#authors","title":"Authors","text":"

    jpxavier-oio has designed the network policy for abcdesktop.io

    "},{"location":"3.3/config/networkpolicy/#requirements","title":"Requirements","text":"
    • You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes.
    • Network policies are implemented by the network plugin. To use network policies, you must be using a networking solution which supports NetworkPolicy.
    "},{"location":"3.3/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

    There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

    • The NetworkPolicy rights contains egress and ingress for pod selected by tag. rights means access (ingress) to this pod and access (egress) from this pod. To define ip filter for user's pod, you need to set egress NetworkPolicy.

    • The NetworkPolicy permits contains egress to a pod selected by tag. The NetworkPolicy permits means permit access to this pod.

    "},{"location":"3.3/config/networkpolicy/#apply-the-default-netpol-default-33yaml-file","title":"Apply the default netpol-default-3.3.yaml file","text":"

    To apply the network policies run the command :

    kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default-3.3.yaml\n

    The command returns

    networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/router-rights created\nnetworkpolicy.networking.k8s.io/router-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
    "},{"location":"3.3/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
    • Login to your abcdesktop
    • Open a webshell and run a curl command.
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    This http request is denied by the network policy and you should get an error message

    You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

    "},{"location":"3.3/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

    To disable the network policies, run the kubectl delete command :

    kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default-3.3.yaml\n
    • Login to your abcdesktop
    • Open the web shell to run the same curl command
    curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

    You should get a json document as http response

    {}\n

    You may need to update the netpol-default.yaml file with your own values.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/","title":"abcdesktop installation","text":""},{"location":"3.3/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-vbbb7     1/1     Running   0          32s\nmemcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s\nmongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s\nnginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s\nopenldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s\npyos-od-8d4988b56-vcd7z         1/1     Running   0          32s\nrouter-od-f5458658-b52hj        1/1     Running   0          33s\nspeedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.sh\nchmod 755 install-3.3.sh \n

    Run install-3.3.sh

    ./install-3.3.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[OK] default account is created\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[OK] pyos-serviceaccount account is created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready\n[OK] pod/console-od-79bf9bf475-gbb62 condition met\n[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready\n[OK] pod/memcached-od-d4b6b6867-c8b4p condition met\n[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready\n[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met\n[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready\n[OK] pod/nginx-od-57dccb8cf9-txgzc condition met\n[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready\n[OK] pod/openldap-od-6955699d5-qhjzr condition met\n[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready\n[OK] pod/pyos-od-777747f64b-r87x5 condition met\n[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready\n[OK] pod/router-od-59d67d664f-f56m8 condition met\n[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready\n[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-gbb62     1/1     Running   0          12s\nmemcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s\nmongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s\nnginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s\nopenldap-od-6955699d5-qhjzr     1/1     Running   0          12s\npyos-od-777747f64b-r87x5        1/1     Running   0          13s\nrouter-od-59d67d664f-f56m8      1/1     Running   0          13s\nspeedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n\n[OK] Please open your web browser and connect to http://localhost:30443/\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.3/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.3/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-3-download-and-create-the-abcdesktop-config-file","title":"Step 3: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#step-4-create-the-abcdesktop-pods-and-services","title":"Step 4: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s\nmemcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s\nmongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s\nnginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s\nopenldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s\npyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s\nrouter-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s\nspeedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -l type=x11server -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME              READY   STATUS    RESTARTS   AGE\nanonymous-c44fc   4/4     Running   0          116s\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.3.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.3.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.3.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-pghrs     1/1     Running   0          12s\nmemcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s\nmongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s\nnginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s\nopenldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s\npyos-od-8d4988b56-7bg5z         1/1     Running   0          12s\nrouter-od-f5458658-znwcg        1/1     Running   0          12s\nspeedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.3/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1\n

    Run install-3.3.ps1

    .\\install-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-zqbdq     1/1     Running   0          22s\nmemcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s\nmongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s\nnginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s\nopenldap-od-6955699d5-rl8rd     1/1     Running   0          21s\npyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s\nrouter-od-c9fd4c987-xvcbq       1/1     Running   0          22s\nspeedtest-od-67db77f86f-6fftb   1/1     Running   0          22s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.3/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.3/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-33","title":"Command to uninstall abcdesktop release 3.3","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.3.sh bash script using a curl.

    "},{"location":"3.3/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.3/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.3/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.sh\nchmod 755 uninstall-3.3.sh\n

    Run the uninstall-3.3.sh command line with your own namespace

    ./uninstall-3.3.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.3/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.3/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.3/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1\n

    Run the uninstall-3.3.ps1 command line with your own namespace

    .\\uninstall-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/","title":"abcdesktop installation","text":""},{"location":"3.4/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.4.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-vbbb7     1/1     Running   0          32s\nmemcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s\nmongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s\nnginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s\nopenldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s\npyos-od-8d4988b56-vcd7z         1/1     Running   0          32s\nrouter-od-f5458658-b52hj        1/1     Running   0          33s\nspeedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.4.sh\nchmod 755 install-3.4.sh \n

    Run install-3.4.sh

    ./install-3.4.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[OK] default account is created\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[OK] pyos-serviceaccount account is created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready\n[OK] pod/console-od-79bf9bf475-gbb62 condition met\n[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready\n[OK] pod/memcached-od-d4b6b6867-c8b4p condition met\n[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready\n[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met\n[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready\n[OK] pod/nginx-od-57dccb8cf9-txgzc condition met\n[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready\n[OK] pod/openldap-od-6955699d5-qhjzr condition met\n[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready\n[OK] pod/pyos-od-777747f64b-r87x5 condition met\n[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready\n[OK] pod/router-od-59d67d664f-f56m8 condition met\n[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready\n[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-gbb62     1/1     Running   0          12s\nmemcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s\nmongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s\nnginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s\nopenldap-od-6955699d5-qhjzr     1/1     Running   0          12s\npyos-od-777747f64b-r87x5        1/1     Running   0          13s\nrouter-od-59d67d664f-f56m8      1/1     Running   0          13s\nspeedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n\n[OK] Please open your web browser and connect to http://localhost:30443/\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.4/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.4/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-3-download-and-create-the-abcdesktop-config-file","title":"Step 3: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#step-4-create-the-abcdesktop-pods-and-services","title":"Step 4: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.4.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s\nmemcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s\nmongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s\nnginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s\nopenldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s\npyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s\nrouter-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s\nspeedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -l type=x11server -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME              READY   STATUS    RESTARTS   AGE\nanonymous-c44fc   4/4     Running   0          116s\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.4.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.4.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.3.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.4.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-pghrs     1/1     Running   0          12s\nmemcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s\nmongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s\nnginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s\nopenldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s\npyos-od-8d4988b56-7bg5z         1/1     Running   0          12s\nrouter-od-f5458658-znwcg        1/1     Running   0          12s\nspeedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.4/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1\n

    Run install-3.3.ps1

    .\\install-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-zqbdq     1/1     Running   0          22s\nmemcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s\nmongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s\nnginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s\nopenldap-od-6955699d5-rl8rd     1/1     Running   0          21s\npyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s\nrouter-od-c9fd4c987-xvcbq       1/1     Running   0          22s\nspeedtest-od-67db77f86f-6fftb   1/1     Running   0          22s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.4/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.4/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-34","title":"Command to uninstall abcdesktop release 3.4","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.4.sh bash script using a curl.

    "},{"location":"3.4/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.4/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.4.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.4/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.4.sh\nchmod 755 uninstall-3.4.sh\n

    Run the uninstall-3.4.sh command line with your own namespace

    ./uninstall-3.4.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.4/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.4/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.4/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1\n

    Run the uninstall-3.3.ps1 command line with your own namespace

    .\\uninstall-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/","title":"abcdesktop installation","text":""},{"location":"3.5/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

    You need to have a

    • kubernetes cluster ready to run
    • kubectl or microk8s command-line tool must be configured to communicate with your cluster.
    • openssl and curl command line must be installed too.

    You can run the Quick installation process or choose the Manually installation step by step

    Linux operating system is recommanded to run abcdesktop.io.

    "},{"location":"3.5/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

    If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

    "},{"location":"3.5/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and extract the latest release automatically (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.5.sh | bash\n

    You can read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-vbbb7     1/1     Running   0          32s\nmemcached-od-d4b6b6867-tbfgf    1/1     Running   0          33s\nmongodb-od-5d996fd57b-tcn45     1/1     Running   0          33s\nnginx-od-796c7d7d6b-lgnjb       1/1     Running   0          33s\nopenldap-od-567dcf7bf6-h2nq9    1/1     Running   0          32s\npyos-od-8d4988b56-vcd7z         1/1     Running   0          32s\nrouter-od-f5458658-b52hj        1/1     Running   0          33s\nspeedtest-od-7fcc9649b4-qllr7   1/1     Running   0          32s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-lgnjb --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

    • create the abcdesktop namespace
    • create clusterRole and service account
    • build all rsa keys pairs for jwt signing and payload encryption
    • download the default configuration file od.config
    • create all services, deployments, secrets and configmaps
    • fetch pod user's container images
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.5.sh\nchmod 755 install-3.5.sh \n

    Run install-3.5.sh

    ./install-3.5.sh --namespace superdesktop\n
    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[OK] default account is created\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[OK] pyos-serviceaccount account is created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/console-od-79bf9bf475-gbb62 Ready\n[OK] pod/console-od-79bf9bf475-gbb62 condition met\n[INFO] waiting for pod/memcached-od-d4b6b6867-c8b4p Ready\n[OK] pod/memcached-od-d4b6b6867-c8b4p condition met\n[INFO] waiting for pod/mongodb-od-5d996fd57b-z2pjl Ready\n[OK] pod/mongodb-od-5d996fd57b-z2pjl condition met\n[INFO] waiting for pod/nginx-od-57dccb8cf9-txgzc Ready\n[OK] pod/nginx-od-57dccb8cf9-txgzc condition met\n[INFO] waiting for pod/openldap-od-6955699d5-qhjzr Ready\n[OK] pod/openldap-od-6955699d5-qhjzr condition met\n[INFO] waiting for pod/pyos-od-777747f64b-r87x5 Ready\n[OK] pod/pyos-od-777747f64b-r87x5 condition met\n[INFO] waiting for pod/router-od-59d67d664f-f56m8 Ready\n[OK] pod/router-od-59d67d664f-f56m8 condition met\n[INFO] waiting for pod/speedtest-od-67db77f86f-wqkb7 Ready\n[OK] pod/speedtest-od-67db77f86f-wqkb7 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-gbb62     1/1     Running   0          12s\nmemcached-od-d4b6b6867-c8b4p    1/1     Running   0          13s\nmongodb-od-5d996fd57b-z2pjl     1/1     Running   0          13s\nnginx-od-57dccb8cf9-txgzc       1/1     Running   0          13s\nopenldap-od-6955699d5-qhjzr     1/1     Running   0          12s\npyos-od-777747f64b-r87x5        1/1     Running   0          13s\nrouter-od-59d67d664f-f56m8      1/1     Running   0          13s\nspeedtest-od-67db77f86f-wqkb7   1/1     Running   0          13s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n\n[OK] Please open your web browser and connect to http://localhost:30443/\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

    The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

    "},{"location":"3.5/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.5/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

    We will create the abcdesktop namespace and set it as default :

    kubectl create namespace abcdesktop\n

    You should read on the standard output

    namespace/abcdesktop created\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

    User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

    • The JWT payload is encrypted with the abcdesktop jwt desktop payload private by pyos
    • The JWT payload is decrypted with the abcdesktop jwt desktop payload public keys by nginx.

    Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

    • The JSON Web Tokens payload is signed with the abcdesktop jwt desktop signing private keys
    • The JSON Web Tokens payload is verified with the abcdesktop jwt desktop signing public keys.

    • The JSON Web Tokens user is signed with the abcdesktop jwt user signing private keys by pyos.

    • The JSON Web Tokens user is verified with the abcdesktop jwt user signing public keys by pyos

      As multiple pods of pyos can run simultaneously, the same private and public keys value are stored into kubernetes secret.

    The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

    The following commands will let you create all necessary keys :

    openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

    Then, create the kubernetes secrets from the new key files:

    kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

    You should read on the standard output :

    secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

    You can verify secrets creation with the following command :

    kubectl get secrets -n abcdesktop\n

    You should read on the standard output :

    NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#step-3-download-and-create-the-abcdesktop-config-file","title":"Step 3: Download and create the abcdesktop config file","text":"

    Download the od.config file. This is the main configuration file for pyos control plane.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

    Create the config map abcdesktop-config in the abcdesktop namespace

    kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

    You should read on sdtout

    configmap/abcdesktop-config created\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#step-4-create-the-abcdesktop-pods-and-services","title":"Step 4: Create the abcdesktop pods and services","text":"

    abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

    Run the command line

    kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.5.yaml\n

    You should read on the standard output

    role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/router-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

    Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

    kubectl get pods -n abcdesktop\n

    You should read on the standard output

    NAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-79bf9bf475-cqtj5     1/1     Running   0          2m18s\nmemcached-od-d4b6b6867-djzr6    1/1     Running   0          2m19s\nmongodb-od-5d996fd57b-gn4hv     1/1     Running   0          2m19s\nnginx-od-796c7d7d6b-rk2d5       1/1     Running   0          2m19s\nopenldap-od-567dcf7bf6-krhpw    1/1     Running   0          2m18s\npyos-od-65bdd9d479-5228d        1/1     Running   0          2m18s\nrouter-od-7b6dff8dd4-pn587      1/1     Running   0          2m19s\nspeedtest-od-7fcc9649b4-n2ldl   1/1     Running   0          2m18s\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your navigator to http://[your-ip-hostname]:30443/

    abcdesktop homepage should be available :

    Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

    Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

    Also, you can run again the command

    kubectl get pods -l type=x11server -n abcdesktop\n

    You should see that the anonymous-XXXXX pod have been created and is Running

    NAME              READY   STATUS    RESTARTS   AGE\nanonymous-c44fc   4/4     Running   0          116s\n

    Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

    Quick installation can be run on Linux or macOS operation system.

    Download and execute the pullapps-3.5.sh script :

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.5.sh | bash\n

    This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

    NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

    list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

    pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

    Quick installation can be run on Windows operation system.

    Download and execute the pullapps-3.5.ps1 script :

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.5.ps1 \n\nInvoke-Expression $($script.Content)\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

    Add new application, require to send an application json document to the control-plane pyos.

    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

    In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

    curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.2/2048-alpine.d.3.2.json --output 2048.json\n

    To inspect image json you can also run crictl inspecti or docker inspect command.

    • crictl inspecti abcdesktopio/2048.d:3.2 > 2048.json
    • docker inspect abcdesktopio/2048.d:3.2 > 2048.json

    The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

    Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

    Send the 2048.json file to the images REST endpoint

    curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

    The response is the json document.

    [{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GET curl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image PUT curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json POST curl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.json DELETE curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

    The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

    kubectl get pods -n abcdesktop\n

    The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    Then the pod STATUS become Running during 42 seconds.

    NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

    This pod is created to ask Kubernetes for pulling the container image.

    "},{"location":"3.5/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

    The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

    Now reconnect to your abcdesktop.

    Open your navigator to http://[your-ip-hostname]:30443/

    http://localhost:30443/\n

    The new applications are installed, and ready to run.

    "},{"location":"3.5/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

    Quick installation can be run on Windows operation system.

    "},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

    To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

    Start Docker Desktop and wait for the docker engine to start.

    Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

    Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

    kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

    "},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

    abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

    Download the OpenSSL v3.2.0 Light executable file.

    Then follow the install process.

    Make sure to keep in mind the path where OpenSSL will be installed.

    Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

    Go to the system variables section and search for Path

    Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

    Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

    openssl version\n

    "},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

    Download and extract the latest release automatically (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1\n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-pghrs     1/1     Running   0          12s\nmemcached-od-d4b6b6867-wjvmz    1/1     Running   0          12s\nmongodb-od-5d996fd57b-2ncll     1/1     Running   0          12s\nnginx-od-796c7d7d6b-cxlzt       1/1     Running   0          12s\nopenldap-od-567dcf7bf6-77zv7    1/1     Running   0          12s\npyos-od-8d4988b56-7bg5z         1/1     Running   0          12s\nrouter-od-f5458658-znwcg        1/1     Running   0          12s\nspeedtest-od-7fcc9649b4-kxnsn   1/1     Running   0          12s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-796c7d7d6b-cxlzt --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.5/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

    You may need to replace the default namespace abcdesktop by your own. The install-3.3.ps1 PowerShell script allows you to set the new namespace as an option.

    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.3.ps1 -OutFile install-3.3.ps1\n

    Run install-3.3.ps1

    .\\install-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.3.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.3\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nsecret/secret-mongodb created                                                                                           deployment.apps/mongodb-od created                                                                                      deployment.apps/memcached-od created                                                                                    deployment.apps/router-od created                                                                                       deployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\ndeployment.apps/console-od created\ndeployment.apps/openldap-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/pyos created\nservice/console created\nservice/http-router created\nservice/website created\nservice/openldap created\n[INFO] waiting for deployment/console-od available\n[OK] deployment.apps/console-od condition met\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/router-od available\n[OK] deployment.apps/router-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nconsole-od-844c749f85-zqbdq     1/1     Running   0          22s\nmemcached-od-d4b6b6867-wn7r4    1/1     Running   0          22s\nmongodb-od-5d996fd57b-xsnkf     1/1     Running   0          22s\nnginx-od-57dccb8cf9-z68q9       1/1     Running   0          22s\nopenldap-od-6955699d5-rl8rd     1/1     Running   0          21s\npyos-od-7f5f8d66b5-q686l        1/1     Running   0          22s\nrouter-od-c9fd4c987-xvcbq       1/1     Running   0          22s\nspeedtest-od-67db77f86f-6fftb   1/1     Running   0          22s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-57dccb8cf9-z68q9 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

    You can open a web browser and go to the http://localhost:30443/

    "},{"location":"3.5/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

    Uninstall abcdesktop for kubernetes

    "},{"location":"3.5/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-35","title":"Command to uninstall abcdesktop release 3.5","text":"

    To uninstall abcdesktop. Choose run run the uninstall-3.5.sh bash script using a curl.

    "},{"location":"3.5/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    If you are using a Windows operating system please click on the link below Quick uninstall for windows

    "},{"location":"3.5/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

    Quick uninstallation can be run on Linux or macOS operation system.

    Download and extract the uninstall bash script (Linux or macOS):

    curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.5.sh | bash\n

    You should read on stdout

    abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

    Please wait for the output message:

    [OK] namespace \"abcdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes.

    "},{"location":"3.5/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
    wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.5.sh\nchmod 755 uninstall-3.5.sh\n

    Run the uninstall-3.5.sh command line with your own namespace

    ./uninstall-3.5.sh --namespace superdesktop\n

    You should read on stdout

    abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

    Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

    "},{"location":"3.5/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.5/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

    Quick uninstallation can be run on Windows operation system.

    Download and extract the uninstall PowerShell script (Windows):

    $script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1 \n\nInvoke-Expression $($script.Content)\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"3.5/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
    curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.3.ps1  -OutFile uninstall-3.3.ps1\n

    Run the uninstall-3.3.ps1 command line with your own namespace

    .\\uninstall-3.3.ps1 --namespace superdesktop\n

    You should read on stdout

    [INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"router-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\ndeployment.apps \"console-od\" deleted\ndeployment.apps \"openldap-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"pyos\" deleted\nservice \"console\" deleted\nservice \"http-router\" deleted\nservice \"website\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
    "},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":"
    • Alexandre DEVELY : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base

    • Cedric HAUWEL : Control Plane PyOS and authentification, included a complete refactor of the control plane

    • Jeremy PETIT : HTML, CSS, Javascript, nodejs: Full Stack Javascript Developer

    • Kevin VOYER : HTML, CSS, Javascript, Firefox clipboard extension, nodejs : Full Stack Javascript Developer

    • Vincent PENVERN : Python, Ansible, Firefox clipboard extension, Pyos and embedded applications

    • Franck SEROT : Project owner, architect, developer, containers and security design, all components, maintainer of the code and has written much of the current code base

    • Jean-Philippe XAVIER: Architect, design and network policies with calico

    "},{"location":"about/authors/#other-contributors","title":"Other Contributors","text":"

    The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.

    "},{"location":"about/gnu-gpl-v2.0/","title":"GNU General Public License","text":"

    Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

    Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

    "},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"

    The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

    When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

    To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

    For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

    We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

    Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

    Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

    The precise terms and conditions for copying, distribution and modification follow.

    "},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"

    0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

    1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

    2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

    • a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
    • b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
    • c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

    3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

    • a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    • b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    • c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

    4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

    5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

    6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

    7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

    8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

    9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

    10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    "},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"

    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \u201cAS IS\u201d WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    END OF TERMS AND CONDITIONS

    "},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"

    If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

    To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year>  <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n

    Also add information on how to contact you by electronic and paper mail.

    If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n

    The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.

    You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:

    Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n

    This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.

    "},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"

    The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.

    We recommend you to start in docker mode first with the Setup Guide in docker mode.

    Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide

    You can also, read the genesis chapters GUI apps on Docker.

    Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.

    "},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"

    Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.

    Topics include:

    • Fundamentals of abcdesktop.io
    • Deploy abcdesktop.io using docker-composer
    • Defined docker image application
    • Build your own application
      • Use standard GNU/Linux Application
      • Use Microsoft Windows Application with Wine
    "},{"location":"about/howreadthisdoc/#the-advanced-of-abcdesktopio","title":"The Advanced of abcdesktop.io","text":"

    This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.

    Topics include:

    • Deploy abcdesktop.io using Kubernetes
    • Storage and Kubernetes drivers
      • Legacy Files server (CIFS, NFS, WebDav)
      • Amazon/S3, Ceph
    • Roles
    • Security
    • Networking Policies
    • Orchestration
    • LoadBalancing
    • Logging with GrayLog
    • Garbage collector
    "},{"location":"about/howtodolabsexercices/","title":"How to do the labs and exercices","text":"

    abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :

    Operating System Recommended version GNU/Linux Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X Catalina version 10.15.3 (and above) Windows 10 Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop or server","text":"
    • If you choose server, please translate the URL request http://localhost with the hostname of your server.

    For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL request http://localhost with http://server01.labs.domain.local

    Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.

    • If you choose desktop, the URL request http://localhost will reach your local services.
    "},{"location":"about/opensource/","title":"Open Source","text":""},{"location":"about/opensource/#abcdesktopio-is-an-open-source-project","title":"abcdesktop.io is an open source project","text":"

    abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.

    Follow the Fork me on github links, to get access to each repository.

    If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.

    "},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"

    abcdesktop.io deplend on a lot of open source diffrents projets.

    "},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"

    Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.

    • http://wiki.ros.org/docker/Tutorials/GUI
    • https://github.com/mviereck/x11docker x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.
    • https://www.digitalocean.com/community/tutorials/how-to-remotely-access-gui-applications-using-docker-and-caddy-on-ubuntu-18-04 By using noVNC and TigerVNC, you can run native applications inside a Docker container and access them remotely using a web browser.
    • HW accelerated GUI apps on Docker Describe How to containerizing a GUI app. Really easy to understand, a good article.
    • https://www.kasmweb.com
    • https://github.com/fcwu/docker-ubuntu-vnc-desktop docker-ubuntu-vnc-desktop is a Docker image to provide web VNC interface to access Ubuntu LXDE/LxQT desktop environment.
    • Dockerize GUI app This project dockerize typical GUI app so that you can visit it in browser. Really good technical solutions.
    • kube-desktop
    "},{"location":"about/play_sound_in_docker/","title":"Play sound inside a docker to a web browser","text":""},{"location":"about/play_sound_in_docker/#sound-in-docker-is-the-big-challenge","title":"Sound in docker is the big challenge","text":"

    As VNC does not support sound, we have to forward a Pulseaudio null-sink output to the user browser, with no latency.

    • Release 1.0 : use the pulseaudio http stream and play wave data (poor sound quality but works in https only)

    • Release 2.0 : use janus webrtc gateway, send pulseaudio rtp stream to janus, and play sound using the web browser webrtc stack (good sound quality)

    • Release 3.0 : use virtual microphone using gstreamer and pulseaudio

    Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented

    "},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"
    • webaudio-wav-stream-player No latency wav stream player using browser fetch streaming API and WebAudio

    • Pulseaudio with module-http-protocol-tcp A proof-of-concept HTTP module, which can be used to introspect the current status of the PulseAudio daemon using HTTP. Just load this module and point your browser to http://localhost:4714/. This module takes the same arguments as module-cli-protocol-tcp.

    • Create Pulseaudio null-sink

    # defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n

    Then use

    load-module module-http-protocol-tcp\n

    Read the http stream data, using fetch call :

    • $target is the container Ip Address
    • $pulseaudio_http_port is the pulseaudio http port ( by default, the http port vallue is
    http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n

    Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js file :

    //\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n    // // total header : 4 + 26 + 12 + 8 = 50 \n    // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n    var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n    var total_length =  header_length + data.byteLength;\n\n    // bitsPerSample MUST BE  8 bits\n\n    // The default byte ordering assumed for WAVE data files is little-endian.\n    var header = new ArrayBuffer(header_length); \n    var d = new DataView(header);\n\n    d.setUint8(0, \"R\".charCodeAt(0)); \n    d.setUint8(1, \"I\".charCodeAt(0));\n    d.setUint8(2, \"F\".charCodeAt(0));\n    d.setUint8(3, \"F\".charCodeAt(0));\n\n    // All integers MUST be set in bigEndian format\n    // Wave chunks containing format information and sampled data\n    // cksize   4   Chunk size: 4+n  \n    // 4: for sizeof( 'WAVE' ) + n \n    // n: Wave chunks containing format information and sampled data\n    //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n    //bitsPerSample data.byteLength + 8+16+12\n    d.setUint32(4, total_length, true); \n\n    // write 4 bytes\n    d.setUint8(8,  \"W\".charCodeAt(0)); \n    d.setUint8(9,  \"A\".charCodeAt(0)); \n    d.setUint8(10, \"V\".charCodeAt(0)); \n    d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n    // write 4 bytes\n    d.setUint8(12, \"f\".charCodeAt(0));\n    d.setUint8(13, \"m\".charCodeAt(0));\n    d.setUint8(14, \"t\".charCodeAt(0));\n    d.setUint8(15, \" \".charCodeAt(0));\n\n\n    // All integers MUST be set in bigEndian format\n\n\n    // Subchunk1Size 16 for PCM.  \n    // Offset 16    \n    // Size 4\n    // This is the size of the rest of the Subchunk which follows this number.\n    // The size of the rest of this subchunk.\n    // All integers MUST be set in bigEndian format\n    // d.setUint32(16, 16, true);\n    // cksize   4   Chunk size: 16, 18 or 40 \n    var chunksize = 18;\n    d.setUint32(16, chunksize, true);\n\n    // The format of the wave data, which will be 1 for uncompressed PCM data.\n    // All integers MUST be set in bigEndian format\n    // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n    d.setUint16(20, format, true);\n\n    // Indicates if the data is mono, stereo, or something else.\n    // NumChannels Mono = 1, Stereo = 2, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint16(22, numberOfChannels, true);\n\n    // The sample rate per second.\n    // SampleRate 8000, 44100, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint32(24, sampleRate, true);\n\n    // byteRate == SampleRate * NumChannels * BitsPerSample/8\n    // All integers MUST be set in bigEndian format\n    var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n    d.setUint32(28, byteRate, true ); \n\n    // blockAlign       == NumChannels * BitsPerSample/8\n    // The number of bytes for one sample including all channels.\n    var blockAlign = numberOfChannels * bitsPerSample / 8; \n     // All integers MUST be set in bigEndian format\n    d.setUint16(32, blockAlign, true ); \n\n    // BitsPerSample    8 bits = 8, 16 bits = 16, etc.\n    d.setUint16(34, bitsPerSample, true);\n\n    // Wave files may include an additional field, usually reserved for non-PCM formats:\n    // bits per Sample \n    // Size of the extension \n    // 2 bytes\n    // Offset \n    var cbSize = 0;\n    d.setUint16(36, cbSize, true);\n\n    d.setUint8(38, \"f\".charCodeAt(0));\n    d.setUint8(39, \"a\".charCodeAt(0));\n    d.setUint8(40, \"c\".charCodeAt(0));\n    d.setUint8(41, \"t\".charCodeAt(0));\n    var cksize = 4;\n    d.setUint32(42, cksize, true);\n    var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n    d.setUint32(46, dwSampleLength, true);\n\n// 50\n    d.setUint8(50, \"d\".charCodeAt(0));\n    d.setUint8(51, \"a\".charCodeAt(0));\n    d.setUint8(52, \"t\".charCodeAt(0));\n    d.setUint8(53, \"a\".charCodeAt(0));\n\n    d.setUint32(54, data.byteLength, true);\n\n//58\n    // data must pad byte 0 or 1 if n is odd\n    return concat(header, data);\n}\n

    Then use the WavPlayer.js from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()

    This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10

    It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.

    "},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"
    • Janus WebRTC Gateway with ICE server. Janus act as WebRTC gateway, listen for udp RTP stream from Pulseaudio and forward it to user web browser.

    • Pulseaudio with module-rtp-send Create a null-sink formated alaw and send it to the WebRTC gateway udp port on localhost.

    ### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n

    Add a RTP stream to Janus WebRTC gateway

    [pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n

    Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC

    "},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"

    The current documentation version is 0.1

    "},{"location":"about/version/#location","title":"Location","text":"

    This documentation is located at https://github.com/abcdesktopio/docs

    "},{"location":"about/version/#installing-make","title":"Installing Make","text":"

    Install the Make package using apt-get

    sudo apt-get install make\n
    "},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"

    Install the mkdocs package using the Makefile:

    make install\n

    make install command runs :

    • pip install mkdocs
    • pip install mkdocs-material

    Make sure that the pip command is installed on you system.

    "},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"
    git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO    -  Cleaning site directory \nINFO    -  Building documentation to directory: /home/alex/src/docs/opsdocs/site \n

    All HTML files are located in the building documentation directory

    "},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"
    make serve\nINFO    -  Serving on http://127.0.0.1:8000\nINFO    -  Start watching changes\nINFO    -  Start detecting changes\n

    Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.

    "},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"

    {\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}

    https://ocv5.pepins.net/API/composer/launchdesktop

    {\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}

    "},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"

    Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/

    "},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"

    DockerFile generator from json file to build applications images run commands

    $ make dockerfile\n$ make build\n

    this command build all generated Dockerfile

    To build documentation files

    $ make docs\n

    this command build all md files, and build list.md

    "},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"
    gnome-2048\n
    "},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"
    2048 (alpine gtk) with error\n
    "},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"
    /usr/bin/gnome-2048\n
    "},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"
    org.gnome.TwentyFortyEight.Gnome-2048\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-alpine-error/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine-error\",\n    \"displayname\": \"2048 (alpine gtk) with error\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    }\n}\n
    "},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
    "},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-alpine-error

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
    "},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
    "},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
    "},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"
    gnome-2048\n
    "},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"
    2048 (alpine gtk)\n
    "},{"location":"applications/2048-alpine/#path","title":"Path","text":"
    /usr/bin/gnome-2048\n
    "},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"
    org.gnome.TwentyFortyEight.Gnome-2048\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-alpine/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"

    json source file 2048-alpine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine\",\n    \"displayname\": \"2048 (alpine gtk)\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"showinview\": \"dock\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"64M\",\n        \"pid_mode\": false,\n        \"network_mode\": \"none\"\n    }\n}\n
    "},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
    "},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-alpine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
    "},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
    "},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
    "},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"
    2048-qt\n
    "},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"
    2048 (ubuntu qt)\n
    "},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"
    /usr/games/2048-qt\n
    "},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"
    2048-qt.2048-qt\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/2048-ubuntu/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/2048-qt.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    ENV QT_X11_NO_MITSHM=1\n
    "},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"

    json source file 2048-ubuntu.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048-ubuntu\",\n    \"displayname\": \"2048 (ubuntu qt)\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"postruncommands\": [\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ]\n}\n
    "},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
    "},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application 2048-ubuntu

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
    "},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
    "},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
    "},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"

    2048-qt

    "},{"location":"applications/2048/#display-name","title":"Display name","text":"

    \"2048\"

    "},{"location":"applications/2048/#path","title":"path","text":"

    \"/usr/games/2048-qt\"

    "},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.22.04

    "},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"
    openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
    "},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"

    \"-configuration .eclipse/1988419495_linux_gtk_x86_64\"

    "},{"location":"applications/apachedirectorystudio/#displayname","title":"Displayname","text":"
    Apache Directory Studio\n
    "},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"
    /usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
    "},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"
    Apache Directory Studio.Apache Directory Studio\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/apachedirectorystudio/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
    "},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"

    json source file apachedirectorystudio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n        \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n        \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n    ],\n    \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n    \"icon\": \"account.svg\",\n    \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n    \"installrecommends\": true,\n    \"keyword\": \"ldap\",\n    \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n    \"name\": \"apachedirectorystudio\",\n    \"displayname\": \"Apache Directory Studio\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
    "},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
    "},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application apachedirectorystudio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
    "},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
    "},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
    "},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"
    astromenace\n
    "},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"
    astromenace\n
    "},{"location":"applications/astromenace/#path","title":"Path","text":"
    /usr/games/AstroMenace\n
    "},{"location":"applications/astromenace/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"
    Astromenace.Astromenace\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/astromenace/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/astromenace.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"

    json source file astromenace.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"astromenace\",\n    \"installrecommends\": true,\n    \"icon\": \"astromenace.svg\",\n    \"launch\": \"Astromenace.Astromenace\",\n    \"name\": \"astromenace\",\n    \"displayname\": \"astromenace\",\n    \"path\": \"/usr/games/AstroMenace\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
    "},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
    "},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application astromenace

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
    "},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
    "},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
    "},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"

    libxss1 atom aspell

    "},{"location":"applications/atom/#arguments","title":"Arguments","text":"

    \"-f\"

    "},{"location":"applications/atom/#display-name","title":"Display name","text":"

    \"Atom\"

    "},{"location":"applications/atom/#path","title":"path","text":"

    \"/usr/bin/atom\"

    "},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"
    \nRUN apt-get update && apt-get install  --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install                          --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install  --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/base/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/base/#arguments","title":"Arguments","text":"

    \"--base\"

    "},{"location":"applications/base/#displayname","title":"Displayname","text":"
    Base\n
    "},{"location":"applications/base/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/base/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
    "},{"location":"applications/base/#file-extensions","title":"File extensions","text":"

    \"odb\"

    "},{"location":"applications/base/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odb\"

    "},{"location":"applications/base/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-base\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/base/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-base.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/base/#json-dump","title":"JSON dump","text":"

    json source file base.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_base.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-base\",\n    \"name\": \"base\",\n    \"displayname\": \"Base\",\n    \"args\": \"--base\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n    \"fileextensions\": \"odb\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"odb\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
    "},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application base

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
    "},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f base.d -t base .\n
    "},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
    "},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"

    \"--no-sandbox\"

    "},{"location":"applications/beekeeperstudio/#displayname","title":"Displayname","text":"
    Beekeeper-studio\n
    "},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"
    /opt/Beekeeper-Studio/beekeeper-studio\n
    "},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"

    \"sql\"

    "},{"location":"applications/beekeeperstudio/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"sql\"

    "},{"location":"applications/beekeeperstudio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"
    beekeeper-studio.beekeeper-studio\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/beekeeperstudio/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/beekeeper-studio.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
    "},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"

    json source file beekeeperstudio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\",\n        \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n        \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n        \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n        \"ENV ELECTRON_ENABLE_LOGGING=true\",\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"beekeeper-studio.svg\",\n    \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n    \"launch\": \"beekeeper-studio.beekeeper-studio\",\n    \"name\": \"beekeeperstudio\",\n    \"displayname\": \"Beekeeper-studio\",\n    \"installrecommends\": false,\n    \"forceconfold\": true,\n    \"host_config\": {\n        \"shm_size\": \"2G\",\n        \"ipc_mode\": \"shareable\"\n    },\n    \"args\": \"--no-sandbox\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"legacyfileextensions\": \"sql\",\n    \"fileextensions\": \"sql\",\n    \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
    "},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application beekeeperstudio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
    "},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
    "},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
    "},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/blender/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"
    blender mesa-dri-gallium\n
    "},{"location":"applications/blender/#displayname","title":"Displayname","text":"
    Blender\n
    "},{"location":"applications/blender/#path","title":"Path","text":"
    /usr/bin/blender\n
    "},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"
    application/x-blender\n
    "},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"

    \"blend,obj,fbx,3ds,ply,stl\"

    "},{"location":"applications/blender/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"
    Blender.Blender\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/blender/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/blender.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"

    json source file blender.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,graphics\",\n    \"apkpackage\": \"blender mesa-dri-gallium\",\n    \"icon\": \"circle_blender.svg\",\n    \"keyword\": \"blender,modeler\",\n    \"launch\": \"Blender.Blender\",\n    \"name\": \"blender\",\n    \"displayname\": \"Blender\",\n    \"path\": \"/usr/bin/blender\",\n    \"mimetype\": \"application/x-blender\",\n    \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
    "},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
    "},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application blender

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
    "},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
    "},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
    "},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/bless/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"
    bless\n
    "},{"location":"applications/bless/#path","title":"Path","text":"
    /usr/bin/bless\n
    "},{"location":"applications/bless/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"
    bless.Bless\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/bless/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/bless.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"

    json source file bless.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"bless\",\n    \"icon\": \"circle_bless.svg\",\n    \"keyword\": \"hexa,decimal\",\n    \"launch\": \"bless.Bless\",\n    \"name\": \"Bless\",\n    \"path\": \"/usr/bin/bless\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
    "},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
    "},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Bless

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
    "},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
    "},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
    "},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/blobby/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"
    blobby\n
    "},{"location":"applications/blobby/#path","title":"Path","text":"
    /usr/games/blobby\n
    "},{"location":"applications/blobby/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"
    blobby.blobby\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/blobby/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/blobby.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"

    json source file blobby.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"blobby\",\n    \"icon\": \"blobby.svg\",\n    \"installrecommends\": false,\n    \"keyword\": \"game\",\n    \"launch\": \"blobby.blobby\",\n    \"name\": \"blobby\",\n    \"path\": \"/usr/games/blobby\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
    "},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
    "},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application blobby

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
    "},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
    "},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
    "},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/boxes/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"
    gnome-boxes sudo\n
    "},{"location":"applications/boxes/#displayname","title":"Displayname","text":"
    Gnome-boxes\n
    "},{"location":"applications/boxes/#path","title":"Path","text":"
    /usr/bin/gnome-boxes\n
    "},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"
    application-x-cd-image;\n
    "},{"location":"applications/boxes/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"
    gnome-boxes.Gnome-boxes\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/boxes/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Boxes.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"

    json source file boxes.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"org.gnome.Boxes.svg\",\n    \"apkpackage\": \"gnome-boxes sudo\",\n    \"keyword\": \"boxes,vm\",\n    \"launch\": \"gnome-boxes.Gnome-boxes\",\n    \"name\": \"boxes\",\n    \"displayname\": \"Gnome-boxes\",\n    \"path\": \"/usr/bin/gnome-boxes\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n    \"mimetype\": \"application-x-cd-image;\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"securitycontext\": {\n        \"allowPrivilegeEscalation\": true,\n        \"capabilities\": {\n            \"add\": [\n                \"NET_ADMIN\",\n                \"CAP_SYS_ADMIN\"\n            ]\n        }\n    }\n}\n
    "},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
    "},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application boxes

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
    "},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
    "},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
    "},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/brackets/#arguments","title":"Arguments","text":"

    \"--no-sandbox --disable-gpu\"

    "},{"location":"applications/brackets/#path","title":"Path","text":"
    /opt/brackets/Brackets\n
    "},{"location":"applications/brackets/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"
    brackets.Brackets\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/brackets/#desktopfile","title":"Desktopfile","text":"
    /opt/brackets/brackets.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"

    json source file brackets.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_brackets.svg\",\n    \"keyword\": \"html,brackets\",\n    \"launch\": \"brackets.Brackets\",\n    \"name\": \"Brackets\",\n    \"path\": \"/opt/brackets/Brackets\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\"\n    },\n    \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"args\": \"--no-sandbox  --disable-gpu\"\n}\n
    "},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
    "},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox  --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox  --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Brackets

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
    "},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
    "},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
    "},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/calc/#distribution","title":"Distribution","text":"

    alpine

    "},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/calc/#arguments","title":"Arguments","text":"

    \"--calc\"

    "},{"location":"applications/calc/#displayname","title":"Displayname","text":"

    \"Calc\"

    "},{"location":"applications/calc/#path","title":"Path","text":"

    \"/usr/lib/libreoffice/program/soffice\"

    "},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/calc/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"

    \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"

    "},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"

    \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"

    "},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ods;ots;csv\"

    "},{"location":"applications/calc/#acl","title":"ACL","text":"

    {\"permit\":[\"all\"]}

    "},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"

    libreoffice.libreoffice-calc

    "},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"

    /usr/share/applications/libreoffice-calc.desktop

    "},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"
    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_calc.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-calc\",\n    \"name\": \"calc\",\n    \"displayname\": \"Calc\",\n    \"showinview\": \"dock\",\n    \"args\": \"--calc\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n    \"legacyfileextensions\": \"ods;ots;csv\",\n    \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/calculator/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"
    gnome-calculator\n
    "},{"location":"applications/calculator/#path","title":"Path","text":"
    /usr/bin/gnome-calculator\n
    "},{"location":"applications/calculator/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"
    gnome-calculator.gnome-calculator\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/calculator/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Calculator.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"

    json source file calculator.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-calculator\",\n    \"icon\": \"gnome_calculator.svg\",\n    \"keyword\": \"calculator\",\n    \"launch\": \"gnome-calculator.gnome-calculator\",\n    \"name\": \"calculator\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-calculator\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
    "},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
    "},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application calculator

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
    "},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
    "},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
    "},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/chess/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"
    gnuchess gnome-chess\n
    "},{"location":"applications/chess/#path","title":"Path","text":"
    /usr/bin/gnome-chess\n
    "},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"
    application/x-chess-pgn\n
    "},{"location":"applications/chess/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"
    gnome-chess.gnome-chess\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chess/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Chess.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"

    json source file chess.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnuchess gnome-chess\",\n    \"icon\": \"circle_chess.svg\",\n    \"keyword\": \"chess gnuchess\",\n    \"launch\": \"gnome-chess.gnome-chess\",\n    \"name\": \"chess\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-chess\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-chess-pgn\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
    "},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
    "},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chess

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
    "},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
    "},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
    "},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/chrome/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"
    krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
    "},{"location":"applications/chrome/#displayname","title":"Displayname","text":"
    Chrome\n
    "},{"location":"applications/chrome/#path","title":"Path","text":"
    /usr/bin/google-chrome-stable\n
    "},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
    "},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/chrome/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/chrome/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"
    google-chrome.Google-chrome\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chrome/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/google-chrome.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
    "},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"

    json source file chrome.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n    ],\n    \"icon\": \"circle_google-chrome.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"google-chrome.Google-chrome\",\n    \"name\": \"chrome\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Chrome\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/google-chrome-stable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
    "},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chrome

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
    "},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
    "},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
    "},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/chromium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"
    chromium\n
    "},{"location":"applications/chromium/#displayname","title":"Displayname","text":"
    chromium (alpine)\n
    "},{"location":"applications/chromium/#path","title":"Path","text":"
    /usr/bin/chromium-browser\n
    "},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
    "},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/chromium/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/chromium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"
    chromium.Chromium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/chromium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/chromium-browser.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"

    json source file chromium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"chromium\",\n    \"icon\": \"circle_chromium.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"chromium.Chromium\",\n    \"name\": \"chromium\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"chromium (alpine)\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/chromium-browser\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
    "},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application chromium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
    "},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
    "},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
    "},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/citrix/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"
    libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
    "},{"location":"applications/citrix/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/citrix/#arguments","title":"Arguments","text":"

    \"-icaroot /opt/Citrix/ICAClient\"

    "},{"location":"applications/citrix/#displayname","title":"Displayname","text":"
    citrix-client\n
    "},{"location":"applications/citrix/#path","title":"Path","text":"
    /opt/Citrix/ICAClient/wfica\n
    "},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"
    application/x-ica;\n
    "},{"location":"applications/citrix/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"
    Wfica.Wfica\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/citrix/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/wfica.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"

    json source file citrix.d.3.0.json

    {\n    \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"postruncommands\": [\n        \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n    \"icon\": \"icaclient.svg\",\n    \"keyword\": \"ica,icaclient,\",\n    \"launch\": \"Wfica.Wfica\",\n    \"name\": \"citrix\",\n    \"displayname\": \"citrix-client\",\n    \"secrets_requirement\": \"citrix\",\n    \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n    \"path\": \"/opt/Citrix/ICAClient/wfica\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"mimetype\": \"application/x-ica;\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"512M\",\n        \"pid_mode\": true,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"usedefaultapplication\": true,\n    \"licence\": \"non-free\"\n}\n
    "},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
    "},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application citrix

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
    "},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
    "},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
    "},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"
    cf8-cli\n
    "},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"

    \"--disable-factory --class pivotalio.cf\"

    "},{"location":"applications/cloudfoundry/#displayname","title":"Displayname","text":"
    Cloud Foundry cli\n
    "},{"location":"applications/cloudfoundry/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.pivotalio.cf\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cloudfoundry/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
    "},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"

    json source file cloudfoundry.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n        \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n    ],\n    \"debpackage\": \"cf8-cli\",\n    \"icon\": \"pivotalio-icon.svg\",\n    \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n    \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n    \"name\": \"cloudFoundry\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"Cloud Foundry cli\",\n    \"args\": \"--disable-factory --class pivotalio.cf\",\n    \"quick\": true\n}\n
    "},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
    "},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cloudFoundry

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
    "},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
    "},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
    "},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"
    cmd.exe wine (alpine)\n
    "},{"location":"applications/cmd.exe/#path","title":"Path","text":"
    /usr/bin/wineconsole\n
    "},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"
    conhost.exe.conhost.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cmd.exe/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"

    json source file cmd.exe.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"cmd.svg\",\n    \"keyword\": \"wine,command,cmd.exe\",\n    \"launch\": \"conhost.exe.conhost.exe\",\n    \"name\": \"cmd.exe\",\n    \"displayname\": \"cmd.exe wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/wineconsole\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
    "},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cmd.exe

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
    "},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
    "},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
    "},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"
    ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
    "},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"

    \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"

    "},{"location":"applications/cntlm/#displayname","title":"Displayname","text":"
    cntlm\n
    "},{"location":"applications/cntlm/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cntlm/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cntlm\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cntlm/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
    "},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
    "},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n    \"icon\": \"cntlm.svg\",\n    \"keyword\": \"cntlm,proxy,ntlm\",\n    \"launch\": \"gnome-terminal-server.cntlm\",\n    \"name\": \"cntlm\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"displayname\": \"cntlm\",\n    \"host_config\": {\n        \"network_mode\": \"container\"\n    },\n    \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n    \"preruncommands\": [\n        \"COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\",\n        \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n    ],\n    \"postruncommands\": [\n        \"RUN chown balloon:root /etc/cntlm.conf\",\n        \"RUN chmod 755 /composer/cntlm.mustache\"\n    ]\n}\n
    "},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
    "},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cntlm

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
    "},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
    "},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
    "},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"
    libgl1 corsix-th\n
    "},{"location":"applications/corsix-th/#path","title":"Path","text":"
    /usr/games/corsix-th\n
    "},{"location":"applications/corsix-th/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"
    corsix-th.corsix-th\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/corsix-th/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/com.corsixth.CorsixTH.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
    "},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"

    json source file corsix-th.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n        \"RUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n        \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n    ],\n    \"debpackage\": \"libgl1 corsix-th\",\n    \"icon\": \"games.svg\",\n    \"keyword\": \"hospital,role,playing\",\n    \"launch\": \"corsix-th.corsix-th\",\n    \"name\": \"corsix-th\",\n    \"path\": \"/usr/games/corsix-th\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
    "},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
    "},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application corsix-th

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
    "},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
    "},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
    "},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cuda/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git\n
    "},{"location":"applications/cuda/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cuda\"

    "},{"location":"applications/cuda/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cuda/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cuda\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cuda/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"

    json source file cuda.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cuda\",\n    \"name\": \"cuda\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cuda\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
    "},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cuda

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
    "},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
    "},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
    "},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
    "},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"

    "},{"location":"applications/cudademo/#displayname","title":"Displayname","text":"
    cuda demo\n
    "},{"location":"applications/cudademo/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cudademo/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cudademo\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cudademo/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"

    json source file cudademo.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cudademo\",\n    \"name\": \"cudademo\",\n    \"displayname\": \"cuda demo\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
    "},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cudademo

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
    "},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
    "},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
    "},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
    "},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=cudadev\"

    "},{"location":"applications/cudadev/#displayname","title":"Displayname","text":"
    cuda developper\n
    "},{"location":"applications/cudadev/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/cudadev/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.cudadev\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/cudadev/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    "},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
    "},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"

    json source file cudadev.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia dev\",\n    \"launch\": \"gnome-terminal-server.cudadev\",\n    \"name\": \"cudadev\",\n    \"displayname\": \"cuda developper\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudadev\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n        \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n        \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n    ]\n}\n
    "},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
    "},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application cudadev

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
    "},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
    "},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
    "},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/dia/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"
    dia dia-lang\n
    "},{"location":"applications/dia/#path","title":"Path","text":"
    /usr/bin/dia\n
    "},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"
    application/x-dia-diagram;\n
    "},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"

    \"dia\"

    "},{"location":"applications/dia/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dia\"

    "},{"location":"applications/dia/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"
    dia-gnome.Dia-gnome\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/dia/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/dia.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"

    json source file dia.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"dia dia-lang\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_dia.svg\",\n    \"launch\": \"dia-gnome.Dia-gnome\",\n    \"name\": \"Dia\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/dia\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-dia-diagram;\",\n    \"fileextensions\": \"dia\",\n    \"legacyfileextensions\": \"dia\",\n    \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
    "},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
    "},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Dia

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
    "},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
    "},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
    "},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/doom/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"
    chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
    "},{"location":"applications/doom/#displayname","title":"Displayname","text":"
    Doom\n
    "},{"location":"applications/doom/#path","title":"Path","text":"
    /usr/games/doom\n
    "},{"location":"applications/doom/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"
    chocolate-doom.chocolate-doom\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/doom/#json-dump","title":"JSON dump","text":"

    json source file doom.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n    \"icon\": \"doom.svg\",\n    \"keyword\": \"doom\",\n    \"launch\": \"chocolate-doom.chocolate-doom\",\n    \"name\": \"doom\",\n    \"displayname\": \"Doom\",\n    \"path\": \"/usr/games/doom\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
    "},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application doom

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
    "},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
    "},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
    "},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/draw/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/draw/#arguments","title":"Arguments","text":"

    \"--draw\"

    "},{"location":"applications/draw/#displayname","title":"Displayname","text":"
    Draw\n
    "},{"location":"applications/draw/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/draw/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
    "},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"

    \"odp;otg\"

    "},{"location":"applications/draw/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odp;otg\"

    "},{"location":"applications/draw/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-draw\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/draw/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-draw.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"

    json source file draw.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_draw.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-draw\",\n    \"name\": \"draw\",\n    \"displayname\": \"Draw\",\n    \"showinview\": \"dock\",\n    \"args\": \"--draw\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n    \"fileextensions\": \"odp;otg\",\n    \"legacyfileextensions\": \"odp;otg\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
    "},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application draw

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
    "},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
    "},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
    "},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/drawio/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"
    libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
    "},{"location":"applications/drawio/#displayname","title":"Displayname","text":"
    draw.io\n
    "},{"location":"applications/drawio/#path","title":"Path","text":"
    /opt/drawio/drawio\n
    "},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"
    application/vnd.jgraph.mxfile;application/vnd.visio;\n
    "},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"

    \"drawio\"

    "},{"location":"applications/drawio/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"drawio\"

    "},{"location":"applications/drawio/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"
    draw.io.draw.io\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/drawio/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/drawio.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"

    json source file drawio.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n    \"icon\": \"circle_drawio.svg\",\n    \"launch\": \"draw.io.draw.io\",\n    \"name\": \"drawio\",\n    \"displayname\": \"draw.io\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/drawio/drawio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n    \"fileextensions\": \"drawio\",\n    \"legacyfileextensions\": \"drawio\",\n    \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n    \"postruncommands\": [\n        \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
    "},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
    "},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application drawio

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
    "},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
    "},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
    "},{"location":"applications/dummy/","title":"Dummy","text":"

    dummy

    "},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.eclipse

    "},{"location":"applications/eclipse/#display-name","title":"Display name","text":"

    \"Eclipse\"

    "},{"location":"applications/eclipse/#path","title":"path","text":"

    \"/usr/bin/eclipse\"

    "},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.sts4

    "},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"

    \"Eclipse Sts4\"

    "},{"location":"applications/eclipse_sts4/#path","title":"path","text":"

    \"/opt/sts/SpringToolSuite4\"

    "},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/edge/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"
    microsoft-edge-stable\n
    "},{"location":"applications/edge/#displayname","title":"Displayname","text":"
    Microsoft Edge\n
    "},{"location":"applications/edge/#path","title":"Path","text":"
    /usr/bin/microsoft-edge-stable\n
    "},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"
    application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
    "},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/edge/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/edge/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"
    microsoft-edge.Microsoft-edge\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/edge/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/microsoft-edge.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
    "},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"

    json source file edge.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"microsoft-edge-stable\",\n    \"preruncommands\": [\n        \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n    ],\n    \"icon\": \"circle_microsoft-edge.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"microsoft-edge.Microsoft-edge\",\n    \"name\": \"edge\",\n    \"displayname\": \"Microsoft Edge\",\n    \"path\": \"/usr/bin/microsoft-edge-stable\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
    "},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application edge

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
    "},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
    "},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
    "},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.elementary

    "},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
    io.elementary.terminal io.elementary.stylesheet\n
    "},{"location":"applications/elementary.terminal/#path","title":"Path","text":"
    /usr/bin/io.elementary.terminal\n
    "},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"
    io.elementary.terminal.Io.elementary.terminal\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/elementary.terminal/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/io.elementary.terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd\",\n    \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n    \"name\": \"elementary.terminal\",\n    \"path\": \"/usr/bin/io.elementary.terminal\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n    \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
    "},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application elementary.terminal

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
    "},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
    "},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
    "},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/eog/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"
    eog\n
    "},{"location":"applications/eog/#path","title":"Path","text":"
    /usr/bin/eog\n
    "},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"
    image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
    "},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"

    \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

    "},{"location":"applications/eog/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

    "},{"location":"applications/eog/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"
    eog.Eog\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/eog/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.eog.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"

    json source file eog.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"eog\",\n    \"icon\": \"circle_eog.svg\",\n    \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"eog.Eog\",\n    \"name\": \"eog\",\n    \"path\": \"/usr/bin/eog\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n    \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
    "},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
    "},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application eog

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
    "},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
    "},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
    "},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/evince/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"
    evince\n
    "},{"location":"applications/evince/#path","title":"Path","text":"
    /usr/bin/evince\n
    "},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"
    application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
    "},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"

    \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"

    "},{"location":"applications/evince/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"pdf;ps;dvi\"

    "},{"location":"applications/evince/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"
    evince.Evince\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/evince/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Evince.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"

    json source file evince.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"evince\",\n    \"icon\": \"circle_acroread.svg\",\n    \"keyword\": \"evince,pdf,viewer\",\n    \"launch\": \"evince.Evince\",\n    \"name\": \"Evince\",\n    \"path\": \"/usr/bin/evince\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n    \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n    \"legacyfileextensions\": \"pdf;ps;dvi\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
    "},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Evince

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
    "},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
    "},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
    "},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/evolution/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"
    evolution dbus-x11\n
    "},{"location":"applications/evolution/#displayname","title":"Displayname","text":"
    Evolution\n
    "},{"location":"applications/evolution/#path","title":"Path","text":"
    /usr/bin/evolution\n
    "},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"
    text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
    "},{"location":"applications/evolution/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"
    evolution.Evolution\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/evolution/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Evolution.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"

    json source file evolution.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"evolution dbus-x11\",\n    \"icon\": \"evolution.svg\",\n    \"keyword\": \"evolution,mail\",\n    \"launch\": \"evolution.Evolution\",\n    \"name\": \"evolution\",\n    \"displayname\": \"Evolution\",\n    \"path\": \"/usr/bin/evolution\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
    "},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
    "},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application evolution

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
    "},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
    "},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
    "},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"
    file-roller\n
    "},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"
    file-roller\n
    "},{"location":"applications/file-roller/#path","title":"Path","text":"
    /usr/bin/file-roller\n
    "},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"
    application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
    "},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"

    \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"

    "},{"location":"applications/file-roller/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"
    file-roller.File-roller\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/file-roller/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.FileRoller.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"

    json source file file-roller.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"file-roller\",\n    \"icon\": \"circle_file-roller.svg\",\n    \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n    \"launch\": \"file-roller.File-roller\",\n    \"name\": \"file-roller\",\n    \"displayname\": \"file-roller\",\n    \"path\": \"/usr/bin/file-roller\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n    \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
    "},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application file-roller

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
    "},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
    "},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
    "},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/filelight/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"
    filelight\n
    "},{"location":"applications/filelight/#displayname","title":"Displayname","text":"
    Filelight\n
    "},{"location":"applications/filelight/#path","title":"Path","text":"
    /usr/bin/filelight\n
    "},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"
    inode/directory;\n
    "},{"location":"applications/filelight/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"
    filelight.filelight\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/filelight/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.filelight.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"

    json source file filelight.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"filelight\",\n    \"icon\": \"filelight.svg\",\n    \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n    \"launch\": \"filelight.filelight\",\n    \"name\": \"filelight\",\n    \"displayname\": \"Filelight\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/filelight\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"inode/directory;\",\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
    "},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
    "},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application filelight

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
    "},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
    "},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
    "},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"
    filezilla\n
    "},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"
    filezilla (alpine)\n
    "},{"location":"applications/filezilla/#path","title":"Path","text":"
    /usr/bin/filezilla\n
    "},{"location":"applications/filezilla/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"
    filezilla.Filezilla\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/filezilla/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/filezilla.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"

    json source file filezilla.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"filezilla\",\n    \"icon\": \"circle_filezilla.svg\",\n    \"keyword\": \"ftp,client\",\n    \"launch\": \"filezilla.Filezilla\",\n    \"name\": \"filezilla\",\n    \"displayname\": \"filezilla (alpine)\",\n    \"path\": \"/usr/bin/filezilla\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
    "},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
    "},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application filezilla

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
    "},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
    "},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
    "},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"
    firefox-esr\n
    "},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"
    Firefox (esr alpine)\n
    "},{"location":"applications/firefox-esr/#path","title":"Path","text":"
    /usr/bin/firefox-esr\n
    "},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"

    \"htm;html;xml;gif\"

    "},{"location":"applications/firefox-esr/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"htm;html;xml\"

    "},{"location":"applications/firefox-esr/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"
    Navigator.firefox-esr\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/firefox-esr/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox-esr.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
    "},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"

    json source file firefox-esr.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox-esr\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox-esr\",\n    \"name\": \"firefox-esr\",\n    \"displayname\": \"Firefox (esr alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox-esr\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
    "},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application firefox-esr

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
    "},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
    "},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
    "},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/firefox/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"
    firefox krb5\n
    "},{"location":"applications/firefox/#displayname","title":"Displayname","text":"
    Firefox (alpine)\n
    "},{"location":"applications/firefox/#path","title":"Path","text":"
    /usr/bin/firefox\n
    "},{"location":"applications/firefox/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"

    \"htm;html;xml;gif\"

    "},{"location":"applications/firefox/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"htm;html;xml\"

    "},{"location":"applications/firefox/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"
    Navigator.firefox\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/firefox/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
    "},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"

    json source file firefox.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"postruncommands\": [\n        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox krb5\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox\",\n    \"args\": \"\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox (alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
    "},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Firefox

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
    "},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
    "},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
    "},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.firefox.rest

    "},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"

    firefox winbind

    "},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"

    \"--class=Rest.Firefox\"

    "},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"

    \"Firefox-Rest\"

    "},{"location":"applications/firefoxrest/#path","title":"path","text":"

    \"/usr/bin/firefox\"

    "},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"

    \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"

    "},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"
    \nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
    "},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/flare/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"
    flare-game\n
    "},{"location":"applications/flare/#arguments","title":"Arguments","text":"

    \"--game=flare-game\"

    "},{"location":"applications/flare/#path","title":"Path","text":"
    /usr/games/flare\n
    "},{"location":"applications/flare/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"
    flare.flare\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/flare/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/flare.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"

    json source file flare.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"flare-game\",\n    \"icon\": \"flare.svg\",\n    \"keyword\": \"flare-game,role,playing\",\n    \"launch\": \"flare.flare\",\n    \"name\": \"flare\",\n    \"args\": \"--game=flare-game\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/flare\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
    "},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
    "},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application flare

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
    "},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
    "},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
    "},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"
    frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"
    frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#path","title":"Path","text":"
    /usr/games/frozen-bubble\n
    "},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"
    perl.perl\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/frozen-bubble/#json-dump","title":"JSON dump","text":"

    json source file frozen-bubble.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"frozen-bubble\",\n    \"icon\": \"frozen-bubble.svg\",\n    \"keyword\": \"frozen,bubble\",\n    \"launch\": \"perl.perl\",\n    \"name\": \"frozen-bubble\",\n    \"displayname\": \"frozen-bubble\",\n    \"path\": \"/usr/games/frozen-bubble\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
    "},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application frozen-bubble

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
    "},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
    "},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
    "},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"
    qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
    "},{"location":"applications/gcompris/#path","title":"Path","text":"
    /usr/games/gcompris-qt\n
    "},{"location":"applications/gcompris/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"
    gcompris-qt.gcompris-qt\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gcompris/#json-dump","title":"JSON dump","text":"

    json source file gcompris.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n    \"icon\": \"gcompris.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"gcompris\",\n    \"launch\": \"gcompris-qt.gcompris-qt\",\n    \"name\": \"GCompris\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/games/gcompris-qt\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
    "},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
    "},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application GCompris

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
    "},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
    "},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
    "},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/geany/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"
    geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
    "},{"location":"applications/geany/#displayname","title":"Displayname","text":"
    Geany\n
    "},{"location":"applications/geany/#path","title":"Path","text":"
    /usr/bin/geany\n
    "},{"location":"applications/geany/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"
    text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
    "},{"location":"applications/geany/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"
    geany.Geany\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/geany/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/geany.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"

    json source file geany.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"geany.svg\",\n    \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n    \"keyword\": \"text,editor,geany,ide\",\n    \"launch\": \"geany.Geany\",\n    \"name\": \"geany\",\n    \"displayname\": \"Geany\",\n    \"path\": \"/usr/bin/geany\",\n    \"showinview\": \"dock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n    \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
    "},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
    "},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application geany

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
    "},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
    "},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
    "},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/gedit/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"
    gedit\n
    "},{"location":"applications/gedit/#path","title":"Path","text":"
    /usr/bin/gedit\n
    "},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"
    text/plain;\n
    "},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"

    \"txt\"

    "},{"location":"applications/gedit/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"txt\"

    "},{"location":"applications/gedit/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"
    gedit.Gedit\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gedit/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gedit.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"

    json source file gedit.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gedit\",\n    \"icon\": \"gedit.svg\",\n    \"keyword\": \"editor\",\n    \"launch\": \"gedit.Gedit\",\n    \"name\": \"Gedit\",\n    \"path\": \"/usr/bin/gedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"text/plain;\",\n    \"fileextensions\": \"txt\",\n    \"legacyfileextensions\": \"txt\",\n    \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
    "},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gedit

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
    "},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
    "},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
    "},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"
    gelemental\n
    "},{"location":"applications/gelemental/#path","title":"Path","text":"
    /usr/bin/gelemental\n
    "},{"location":"applications/gelemental/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"
    gelemental.Gelemental\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gelemental/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gelemental.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"

    json source file gelemental.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gelemental\",\n    \"icon\": \"gelemental.svg\",\n    \"keyword\": \"gelemental\",\n    \"launch\": \"gelemental.Gelemental\",\n    \"name\": \"gElemental\",\n    \"path\": \"/usr/bin/gelemental\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
    "},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
    "},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application gElemental

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
    "},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
    "},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
    "},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"
    geogebra\n
    "},{"location":"applications/geogebra/#path","title":"Path","text":"
    /usr/bin/geogebra\n
    "},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"

    \"ggb;ggt\"

    "},{"location":"applications/geogebra/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ggb;ggt\"

    "},{"location":"applications/geogebra/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"
    geogebra-GeoGebra.geogebra-GeoGebra\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/geogebra/#json-dump","title":"JSON dump","text":"

    json source file geogebra.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"geogebra\",\n    \"icon\": \"geogebra.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"geogebra,math\",\n    \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n    \"name\": \"Geogebra\",\n    \"path\": \"/usr/bin/geogebra\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"fileextensions\": \"ggb;ggt\",\n    \"legacyfileextensions\": \"ggb;ggt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktop\": \"geogebra.desktop\"\n}\n
    "},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
    "},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Geogebra

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
    "},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
    "},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
    "},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.java.gephi

    "},{"location":"applications/gephi/#display-name","title":"Display name","text":"

    \"Gephi\"

    "},{"location":"applications/gephi/#path","title":"path","text":"

    \"/opt/gephi-0.9.1/bin/gephi\"

    "},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.gimagereader

    "},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"

    \"OCR-gimagereader\"

    "},{"location":"applications/gimagereader/#path","title":"path","text":"

    \"/usr/bin/gimagereader-gtk\"

    "},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"

    \"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"

    "},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"

    \"bmp;jpeg;png,tiff,tga\"

    "},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/gimp/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"
    gimp gimp-lang\n
    "},{"location":"applications/gimp/#path","title":"Path","text":"
    /usr/bin/gimp\n
    "},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"
    image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
    "},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"

    \"dds\"

    "},{"location":"applications/gimp/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dds\"

    "},{"location":"applications/gimp/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"
    gimp.Gimp\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gimp/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gimp.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"

    json source file gimp.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"gimp gimp-lang\",\n    \"icon\": \"circle_gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\": \"dds\",\n    \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n    \"usedefaultapplication\": false,\n    \"quick\": true\n}\n
    "},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
    "},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gimp

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
    "},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
    "},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
    "},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"
    gnumeric glpk\n
    "},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"
    Gnumerix (alpine)\n
    "},{"location":"applications/gnumeric/#path","title":"Path","text":"
    /usr/bin/gnumeric\n
    "},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"
    application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
    "},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"

    \"gnm\"

    "},{"location":"applications/gnumeric/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"gnm\"

    "},{"location":"applications/gnumeric/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"
    gnumeric.Gnumeric\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gnumeric/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnumeric.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"

    json source file gnumeric.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnumeric glpk\",\n    \"icon\": \"gnumeric.svg\",\n    \"keyword\": \"numeric\",\n    \"launch\": \"gnumeric.Gnumeric\",\n    \"displayname\": \"Gnumerix (alpine)\",\n    \"name\": \"Gnumeric\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnumeric\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n    \"fileextensions\": \"gnm\",\n    \"legacyfileextensions\": \"gnm\",\n    \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
    "},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gnumeric

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
    "},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
    "},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
    "},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/golly/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"
    golly\n
    "},{"location":"applications/golly/#path","title":"Path","text":"
    /usr/games/golly\n
    "},{"location":"applications/golly/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"
    golly.Golly\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/golly/#json-dump","title":"JSON dump","text":"

    json source file golly.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"golly\",\n    \"icon\": \"golly.svg\",\n    \"keyword\": \"golly\",\n    \"launch\": \"golly.Golly\",\n    \"name\": \"Golly\",\n    \"path\": \"/usr/games/golly\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
    "},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
    "},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Golly

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
    "},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
    "},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
    "},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/gretl/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"
    gretl\n
    "},{"location":"applications/gretl/#path","title":"Path","text":"
    /usr/bin/gretl\n
    "},{"location":"applications/gretl/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"
    gretl_x11.Gretl_x11\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/gretl/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gretl\",\n    \"icon\": \"gretl.svg\",\n    \"keyword\": \"gretl\",\n    \"launch\": \"gretl_x11.Gretl_x11\",\n    \"name\": \"Gretl\",\n    \"path\": \"/usr/bin/gretl\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
    "},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Gretl

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
    "},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
    "},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
    "},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/hyper/#path","title":"Path","text":"
    /opt/Hyper/hyper\n
    "},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/ssh\n
    "},{"location":"applications/hyper/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"
    hyper.Hyper\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/hyper/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/hyper.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
    "},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"

    json source file hyper.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n    ],\n    \"icon\": \"hyper.svg\",\n    \"keyword\": \"terminal,remote\",\n    \"launch\": \"hyper.Hyper\",\n    \"name\": \"hyper\",\n    \"path\": \"/opt/Hyper/hyper\",\n    \"mimetype\": \"x-scheme-handler/ssh\",\n    \"fileextensions\": \"\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
    "},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
    "},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application hyper

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
    "},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
    "},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
    "},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/impress/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/impress/#arguments","title":"Arguments","text":"

    \"--impress\"

    "},{"location":"applications/impress/#displayname","title":"Displayname","text":"
    Impress\n
    "},{"location":"applications/impress/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/impress/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
    "},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"

    \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"

    "},{"location":"applications/impress/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odp\"

    "},{"location":"applications/impress/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-impress\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/impress/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-impress.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"

    json source file impress.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_impress.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-impress\",\n    \"name\": \"impress\",\n    \"displayname\": \"Impress\",\n    \"showinview\": \"dock\",\n    \"args\": \"--impress\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n    \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n    \"legacyfileextensions\": \"odp\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
    "},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application impress

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
    "},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
    "},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
    "},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"
    inkscape inkscape-lang\n
    "},{"location":"applications/inkscape/#path","title":"Path","text":"
    /usr/bin/inkscape\n
    "},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"
    image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
    "},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"

    \"ai;cdr\"

    "},{"location":"applications/inkscape/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"ai;cdr\"

    "},{"location":"applications/inkscape/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"
    org.inkscape.Inkscape.Inkscape\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/inkscape/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.inkscape.Inkscape.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"

    json source file inkscape.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"inkscape inkscape-lang\",\n    \"icon\": \"circle_inkscape.svg\",\n    \"keyword\": \"inkscape\",\n    \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n    \"name\": \"inkscape\",\n    \"path\": \"/usr/bin/inkscape\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n    \"fileextensions\": \"ai;cdr\",\n    \"legacyfileextensions\": \"ai;cdr\",\n    \"installrecommends\": true,\n    \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
    "},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
    "},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application inkscape

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
    "},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
    "},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
    "},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"

    "},{"location":"applications/jupyter/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/jupyter/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.jupyter\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/jupyter/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
    "},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
    "},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"

    json source file jupyter.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyter\",\n    \"name\": \"jupyter\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
    "},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
    "},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application jupyter

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
    "},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
    "},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
    "},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.nvidia.22.04

    "},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"

    "},{"location":"applications/jupyternvidia/#displayname","title":"Displayname","text":"
    jupyter nvidia\n
    "},{"location":"applications/jupyternvidia/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.jupyternvidia\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/jupyternvidia/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
    "},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
    "},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"

    json source file jupyternvidia.d.3.0.json

    {\n    \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n        \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n        \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n        \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n        \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n        \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install tensorflow-gpu\",\n        \"RUN pip3 install jupyter notebook\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip3 install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyternvidia\",\n    \"name\": \"jupyternvidia\",\n    \"displayname\": \"jupyter nvidia\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
    "},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
    "},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application jupyternvidia

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
    "},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
    "},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
    "},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"
    kalzium\n
    "},{"location":"applications/kalzium/#path","title":"Path","text":"
    /usr/bin/kalzium\n
    "},{"location":"applications/kalzium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"
    kalzium.kalzium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kalzium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kalzium.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"

    json source file kalzium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kalzium\",\n    \"icon\": \"kalzium.svg\",\n    \"keyword\": \"kalzium\",\n    \"launch\": \"kalzium.kalzium\",\n    \"name\": \"Kalzium\",\n    \"path\": \"/usr/bin/kalzium\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
    "},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Kalzium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
    "},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
    "},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
    "},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"
    kdiamond\n
    "},{"location":"applications/kdiamond/#path","title":"Path","text":"
    /usr/games/kdiamond\n
    "},{"location":"applications/kdiamond/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"
    kdiamond.kdiamond\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kdiamond/#json-dump","title":"JSON dump","text":"

    json source file kdiamond.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"kdiamond\",\n    \"icon\": \"kdiamond.svg\",\n    \"keyword\": \"kdiamond\",\n    \"launch\": \"kdiamond.kdiamond\",\n    \"name\": \"kDiamond\",\n    \"path\": \"/usr/games/kdiamond\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
    "},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kDiamond

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
    "},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
    "},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
    "},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"
    kgeography\n
    "},{"location":"applications/kgeography/#path","title":"Path","text":"
    /usr/bin/kgeography\n
    "},{"location":"applications/kgeography/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"
    kgeography.kgeography\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kgeography/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kgeography.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"

    json source file kgeography.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kgeography\",\n    \"icon\": \"kgeography.svg\",\n    \"keyword\": \"kgeography,geography\",\n    \"launch\": \"kgeography.kgeography\",\n    \"name\": \"Kgeography\",\n    \"path\": \"/usr/bin/kgeography\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
    "},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Kgeography

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
    "},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
    "},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
    "},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/kigo/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11 dbus-user-session gnugo kigo\n
    "},{"location":"applications/kigo/#displayname","title":"Displayname","text":"
    kigo\n
    "},{"location":"applications/kigo/#path","title":"Path","text":"
    /usr/games/kigo\n
    "},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"
    application/x-go-sgf;\n
    "},{"location":"applications/kigo/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"
    kigo.kigo\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kigo/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kigo.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
    "},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"

    json source file kigo.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"args\": \"\",\n    \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n    \"icon\": \"kigo.svg\",\n    \"keyword\": \"go,kigo,gnugo\",\n    \"launch\": \"kigo.kigo\",\n    \"name\": \"kigo\",\n    \"mimetype\": \"application/x-go-sgf;\",\n    \"displayname\": \"kigo\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"path\": \"/usr/games/kigo\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n    ]\n}\n
    "},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
    "},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kigo

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
    "},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
    "},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
    "},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/klickety/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"
    breeze-icon-theme dbus-x11 dbus-user-session klickety\n
    "},{"location":"applications/klickety/#path","title":"Path","text":"
    /usr/games/klickety\n
    "},{"location":"applications/klickety/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"
    klickety.klickety\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/klickety/#json-dump","title":"JSON dump","text":"

    json source file klickety.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n    \"icon\": \"klickety.svg\",\n    \"keyword\": \"klickety\",\n    \"launch\": \"klickety.klickety\",\n    \"name\": \"Klickety\",\n    \"path\": \"/usr/games/klickety\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
    "},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Klickety

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
    "},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
    "},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
    "},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/klotski/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-klotski\n
    "},{"location":"applications/klotski/#path","title":"Path","text":"
    /usr/games/gnome-klotski\n
    "},{"location":"applications/klotski/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"
    gnome-klotski.Gnome-klotski\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/klotski/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-klotski.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"

    json source file klotski.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-klotski\",\n    \"icon\": \"circle_gnome-klotski.svg\",\n    \"keyword\": \"gnome klotski,game klotski,klotski\",\n    \"launch\": \"gnome-klotski.Gnome-klotski\",\n    \"name\": \"klotski\",\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/gnome-klotski\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
    "},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
    "},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application klotski

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
    "},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
    "},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
    "},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/konsole/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"
    konsole, sudo\n
    "},{"location":"applications/konsole/#path","title":"Path","text":"
    /usr/bin/konsole\n
    "},{"location":"applications/konsole/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"
    konsole.konsole\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/konsole/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"

    json source file konsole.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"icon\": \"konsole.svg\",\n    \"apkpackage\": \"konsole, sudo\",\n    \"keyword\": \"ksonsole,console,shell,bash,sh\",\n    \"launch\": \"konsole.konsole\",\n    \"name\": \"konsole\",\n    \"path\": \"/usr/bin/konsole\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
    "},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
    "},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application konsole

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
    "},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
    "},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
    "},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu

    "},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11 dbus-user-session ksquares\n
    "},{"location":"applications/ksquares/#path","title":"Path","text":"
    /usr/games/ksquares\n
    "},{"location":"applications/ksquares/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"
    ksquares.ksquares\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/ksquares/#json-dump","title":"JSON dump","text":"

    json source file ksquares.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n    \"icon\": \"ksquares.svg\",\n    \"keyword\": \"ksquares\",\n    \"launch\": \"ksquares.ksquares\",\n    \"name\": \"kSquares\",\n    \"path\": \"/usr/games/ksquares\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
    "},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
    "},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kSquares

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
    "},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
    "},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
    "},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"
    kturtle mesa-dri-gallium\n
    "},{"location":"applications/kturtle/#path","title":"Path","text":"
    /usr/bin/kturtle\n
    "},{"location":"applications/kturtle/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"
    kturtle.kturtle\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/kturtle/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.kturtle.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"

    json source file kturtle.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kturtle mesa-dri-gallium\",\n    \"icon\": \"kturtle.svg\",\n    \"keyword\": \"kturtle\",\n    \"launch\": \"kturtle.kturtle\",\n    \"name\": \"kTurtle\",\n    \"path\": \"/usr/bin/kturtle\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
    "},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
    "},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application kTurtle

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
    "},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
    "},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
    "},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/leocad/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"
    leocad\n
    "},{"location":"applications/leocad/#arguments","title":"Arguments","text":"

    \"-l /usr/bin/leocad.library.bin\"

    "},{"location":"applications/leocad/#path","title":"Path","text":"
    /usr/bin/leocad\n
    "},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"
    application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
    "},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"

    \"lcd\"

    "},{"location":"applications/leocad/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"lcd\"

    "},{"location":"applications/leocad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"
    leocad.Leocad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/leocad/#json-dump","title":"JSON dump","text":"

    json source file leocad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"-l /usr/bin/leocad.library.bin\",\n    \"cat\": \"games\",\n    \"debpackage\": \"leocad\",\n    \"icon\": \"leocad.svg\",\n    \"keyword\": \"cad,lego\",\n    \"launch\": \"leocad.Leocad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"Leocad\",\n    \"path\": \"/usr/bin/leocad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n    \"fileextensions\": \"lcd\",\n    \"legacyfileextensions\": \"lcd\"\n}\n
    "},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
    "},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Leocad

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
    "},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
    "},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
    "},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/librecad/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"
    librecad\n
    "},{"location":"applications/librecad/#path","title":"Path","text":"
    /usr/bin/librecad\n
    "},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"
    image/vnd.dxf;\n
    "},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"

    \"dxf;dwg\"

    "},{"location":"applications/librecad/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"dxf;dwg\"

    "},{"location":"applications/librecad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"
    librecad.Librecad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/librecad/#json-dump","title":"JSON dump","text":"

    json source file librecad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"librecad\",\n    \"icon\": \"librecad.svg\",\n    \"keyword\": \"librecad,modeling\",\n    \"launch\": \"librecad.Librecad\",\n    \"name\": \"LibreCAD\",\n    \"path\": \"/usr/bin/librecad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"image/vnd.dxf;\",\n    \"fileextensions\": \"dxf;dwg\",\n    \"legacyfileextensions\": \"dxf;dwg\"\n}\n
    "},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
    "},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application LibreCAD

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
    "},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
    "},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
    "},{"location":"applications/list/","title":"Application list","text":"

    This array describe the application list ready to use with abcdesktop.

    icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-mahjongg\n
    "},{"location":"applications/mahjongg/#path","title":"Path","text":"
    /usr/games/gnome-mahjongg\n
    "},{"location":"applications/mahjongg/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"
    gnome-mahjongg.Gnome-mahjongg\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mahjongg/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-mahjongg.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"

    json source file mahjongg.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-mahjongg\",\n    \"icon\": \"circle_gnome-mahjongg.svg\",\n    \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n    \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n    \"name\": \"mahjongg\",\n    \"path\": \"/usr/games/gnome-mahjongg\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
    "},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
    "},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application mahjongg

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
    "},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
    "},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
    "},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/maps/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"
    gnome-maps\n
    "},{"location":"applications/maps/#path","title":"Path","text":"
    /usr/bin/gnome-maps\n
    "},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"
    application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
    "},{"location":"applications/maps/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Maps.org.gnome.Maps\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/maps/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Maps.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"

    json source file maps.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-maps\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"icon\": \"org.gnome.Maps.svg\",\n    \"keyword\": \"maps\",\n    \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n    \"name\": \"maps\",\n    \"path\": \"/usr/bin/gnome-maps\",\n    \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
    "},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
    "},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application maps

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
    "},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
    "},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
    "},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/math/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/math/#arguments","title":"Arguments","text":"

    \"--math\"

    "},{"location":"applications/math/#displayname","title":"Displayname","text":"
    Math\n
    "},{"location":"applications/math/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/math/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
    "},{"location":"applications/math/#file-extensions","title":"File extensions","text":"

    \"odf;odc\"

    "},{"location":"applications/math/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odf;odc\"

    "},{"location":"applications/math/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-math\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/math/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-math.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/math/#json-dump","title":"JSON dump","text":"

    json source file math.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_math.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-math\",\n    \"name\": \"math\",\n    \"displayname\": \"Math\",\n    \"args\": \"--math\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n    \"fileextensions\": \"odf;odc\",\n    \"legacyfileextensions\": \"odf;odc\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
    "},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application math

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
    "},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f math.d -t math .\n
    "},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
    "},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"

    ubuntu

    "},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"
    mathwar\n
    "},{"location":"applications/mathwar/#path","title":"Path","text":"
    /usr/games/mathwar\n
    "},{"location":"applications/mathwar/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"
    mathwar.Mathwar\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mathwar/#json-dump","title":"JSON dump","text":"

    json source file mathwar.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"mathwar\",\n    \"icon\": \"mathwar.svg\",\n    \"keyword\": \"mathwar,math\",\n    \"launch\": \"mathwar.Mathwar\",\n    \"name\": \"Mathwar\",\n    \"path\": \"/usr/games/mathwar\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
    "},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Mathwar

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
    "},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
    "},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
    "},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/minecraft/#path","title":"Path","text":"
    /usr/bin/minecraft-launcher\n
    "},{"location":"applications/minecraft/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"
    minecraft-launcher.Minecraft Launcher\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/minecraft/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/minecraft-launcher.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
    "},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"

    json source file minecraft.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_minecraft.svg\",\n    \"keyword\": \"minecraft\",\n    \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n    \"name\": \"minecraft\",\n    \"path\": \"/usr/bin/minecraft-launcher\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktop\": \"minecraft-launcher.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"4G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n        \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n    ]\n}\n
    "},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
    "},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application minecraft

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
    "},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
    "},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
    "},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/mines/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"
    gnome-mines\n
    "},{"location":"applications/mines/#displayname","title":"Displayname","text":"
    gnome-mines (alpine)\n
    "},{"location":"applications/mines/#path","title":"Path","text":"
    /usr/bin/gnome-mines\n
    "},{"location":"applications/mines/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"
    gnome-mines.Gnome-mines\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/mines/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Mines.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"

    json source file mines.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"displayname\": \"gnome-mines (alpine)\",\n    \"apkpackage\": \"gnome-mines\",\n    \"icon\": \"circle_gnome-mines.svg\",\n    \"keyword\": \"gnome mines,game mines,mines\",\n    \"launch\": \"gnome-mines.Gnome-mines\",\n    \"name\": \"Mines\",\n    \"path\": \"/usr/bin/gnome-mines\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
    "},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
    "},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Mines

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
    "},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
    "},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
    "},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
    "},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"
    FileManager\n
    "},{"location":"applications/nautilus/#path","title":"Path","text":"
    /usr/bin/nautilus\n
    "},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/nautilus/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Nautilus.Org.gnome.Nautilus\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/nautilus/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Nautilus.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
    "},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"

    json source file nautilus.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"preruncommands\": [\n        \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n        \"COPY composer/node /composer/node\",\n        \"RUN cd /composer/node/ocdownload && npm install\",\n        \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n        \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n        \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n    ],\n    \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n    \"icon\": \"circle_filemanager.svg\",\n    \"keyword\": \"file,manager,nautilus\",\n    \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n    \"name\": \"nautilus\",\n    \"displayname\": \"FileManager\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/nautilus\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
    "},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
    "},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application nautilus

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
    "},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
    "},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
    "},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk

    "},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"

    netbeans

    "},{"location":"applications/netbeans/#display-name","title":"Display name","text":"

    \"Netbeans\"

    "},{"location":"applications/netbeans/#path","title":"path","text":"

    \"/usr/bin/netbeans\"

    "},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"
    Notepad Wine (alpine)\n
    "},{"location":"applications/notepad-wine/#path","title":"Path","text":"
    /usr/bin/notepad\n
    "},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"
    application/text;\n
    "},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"

    \"txt;log;\"

    "},{"location":"applications/notepad-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"
    notepad.exe.notepad.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/notepad-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"

    json source file notepad-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"apkpackage\": \"wine\",\n    \"icon\": \"notepad.svg\",\n    \"keyword\": \"wine,notepad,text\",\n    \"launch\": \"notepad.exe.notepad.exe\",\n    \"name\": \"notepad-wine\",\n    \"displayname\": \"Notepad Wine (alpine)\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;\",\n    \"path\": \"/usr/bin/notepad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
    "},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application notepad-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
    "},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
    "},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
    "},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"
    notepadqq\n
    "},{"location":"applications/notepadqq/#path","title":"Path","text":"
    /usr/bin/notepadqq\n
    "},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"
    text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
    "},{"location":"applications/notepadqq/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"
    notepadqq-bin.Notepadqq\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/notepadqq/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/notepadqq.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"

    json source file notepadqq.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,development\",\n    \"debpackage\": \"notepadqq\",\n    \"icon\": \"notepadqq.svg\",\n    \"keyword\": \"notepad,plus,editor\",\n    \"launch\": \"notepadqq-bin.Notepadqq\",\n    \"name\": \"notepadqq\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/bin/notepadqq\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
    "},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
    "},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application notepadqq

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
    "},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
    "},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
    "},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/octave/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"
    octave\n
    "},{"location":"applications/octave/#path","title":"Path","text":"
    /usr/bin/octave\n
    "},{"location":"applications/octave/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"
    octave-gui.octave-gui\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/octave/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/www.octave.org-octave.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"

    json source file octave.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"octave\",\n    \"icon\": \"Gnu-octave-logo.svg\",\n    \"keyword\": \"octave\",\n    \"launch\": \"octave-gui.octave-gui\",\n    \"name\": \"octave\",\n    \"path\": \"/usr/bin/octave\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n    \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
    "},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
    "},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application octave

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
    "},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
    "},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
    "},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"
    onlyoffice-desktopeditors\n
    "},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"
    OnlyOffice\n
    "},{"location":"applications/onlyoffice/#path","title":"Path","text":"
    /usr/bin/desktopeditors\n
    "},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
    "},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"

    \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"

    "},{"location":"applications/onlyoffice/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"
    DesktopEditors.DesktopEditors\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/onlyoffice/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/onlyoffice-desktopeditors.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"

    json source file onlyoffice.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n        \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"onlyoffice-desktopeditors\",\n    \"icon\": \"onlyoffice-desktopeditors.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"office,onlyoffice,desktop,editor\",\n    \"launch\": \"DesktopEditors.DesktopEditors\",\n    \"name\": \"onlyoffice\",\n    \"displayname\": \"OnlyOffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/desktopeditors\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n    \"args\": \"\",\n    \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n    \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n    \"licence\": \"non-free\"\n}\n
    "},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
    "},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application onlyoffice

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
    "},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
    "},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
    "},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/openshift/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"
    rhc gnome-terminal\n
    "},{"location":"applications/openshift/#arguments","title":"Arguments","text":"

    \"--disable-factory --class openshift.cli\"

    "},{"location":"applications/openshift/#displayname","title":"Displayname","text":"
    OpenShift cli\n
    "},{"location":"applications/openshift/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/openshift/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.openshift.cli\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/openshift/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
    "},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n    ],\n    \"debpackage\": \"rhc gnome-terminal\",\n    \"icon\": \"openshift.svg\",\n    \"keyword\": \"oc,openshift\",\n    \"launch\": \"gnome-terminal-server.openshift.cli\",\n    \"name\": \"openshift\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"OpenShift cli\",\n    \"args\": \"--disable-factory --class openshift.cli\",\n    \"quick\": true\n}\n
    "},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
    "},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application openshift

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
    "},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
    "},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
    "},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/pinta/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"
    pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
    "},{"location":"applications/pinta/#displayname","title":"Displayname","text":"
    Pinta (alpine)\n
    "},{"location":"applications/pinta/#path","title":"Path","text":"
    /usr/bin/pinta\n
    "},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"
    image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
    "},{"location":"applications/pinta/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"
    Pinta.Pinta\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/pinta/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/pinta.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"

    json source file pinta.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"displayname\": \"Pinta (alpine)\",\n    \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n    \"icon\": \"pinta.svg\",\n    \"keyword\": \"pinta,paint\",\n    \"launch\": \"Pinta.Pinta\",\n    \"name\": \"Pinta\",\n    \"path\": \"/usr/bin/pinta\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n    \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
    "},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
    "},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Pinta

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
    "},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
    "},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
    "},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/planner/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"
    planner\n
    "},{"location":"applications/planner/#path","title":"Path","text":"
    /usr/bin/planner\n
    "},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"
    application/x-planner;\n
    "},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"

    \"mpp;mpx\"

    "},{"location":"applications/planner/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"mpp;mpx\"

    "},{"location":"applications/planner/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"
    planner.Planner\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/planner/#json-dump","title":"JSON dump","text":"

    json source file planner.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"planner\",\n    \"icon\": \"planner.svg\",\n    \"launch\": \"planner.Planner\",\n    \"name\": \"Planner\",\n    \"path\": \"/usr/bin/planner\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/x-planner;\",\n    \"fileextensions\": \"mpp;mpx\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"mpp;mpx\"\n}\n
    "},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
    "},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Planner

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
    "},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
    "},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
    "},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/postman/#displayname","title":"Displayname","text":"
    Postman\n
    "},{"location":"applications/postman/#path","title":"Path","text":"
    /usr/local/bin/Postman/app/Postman\n
    "},{"location":"applications/postman/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"
    postman.Postman\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/postman/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
    "},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"

    json source file postman.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n    ],\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"installrecommends\": false,\n    \"icon\": \"circle_postman.svg\",\n    \"keyword\": \"http,post,json\",\n    \"launch\": \"postman.Postman\",\n    \"displayname\": \"Postman\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"postman\",\n    \"path\": \"/usr/local/bin/Postman/app/Postman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
    "},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
    "},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application postman

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
    "},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
    "},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
    "},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/powershell/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"
    powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
    "},{"location":"applications/powershell/#arguments","title":"Arguments","text":"

    \"--class=powershell -- /usr/bin/pwsh\"

    "},{"location":"applications/powershell/#displayname","title":"Displayname","text":"
    Powershell\n
    "},{"location":"applications/powershell/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"
    application/hlp;\n
    "},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"

    \"hlp;\"

    "},{"location":"applications/powershell/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.powershell\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/powershell/#json-dump","title":"JSON dump","text":"

    json source file powershell.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n    \"icon\": \"powershell.svg\",\n    \"keyword\": \"powershell\",\n    \"launch\": \"gnome-terminal-server.powershell\",\n    \"name\": \"powershell\",\n    \"displayname\": \"Powershell\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
    "},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application powershell

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
    "},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
    "},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
    "},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"
    putty\n
    "},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"
    Putty Unix\n
    "},{"location":"applications/putty-unix/#path","title":"Path","text":"
    /usr/bin/putty\n
    "},{"location":"applications/putty-unix/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"
    putty.Putty\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/putty-unix/#json-dump","title":"JSON dump","text":"

    json source file putty-unix.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"putty\",\n    \"icon\": \"circle_putty-unix.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.Putty\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-unix\",\n    \"displayname\": \"Putty Unix\",\n    \"path\": \"/usr/bin/putty\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
    "},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application putty-unix

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
    "},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
    "},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
    "},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"

    \"/composer/bin/putty.exe\"

    "},{"location":"applications/putty-wine/#displayname","title":"Displayname","text":"
    Putty Wine (alpine)\n
    "},{"location":"applications/putty-wine/#path","title":"Path","text":"
    /usr/bin/wine64\n
    "},{"location":"applications/putty-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"
    putty.exe.putty.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/putty-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
    "},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"

    json source file putty-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"RUN mkdir -p /composer/bin\",\n        \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n    ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"wine,putty,ssh,terminal\",\n    \"launch\": \"putty.exe.putty.exe\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine (alpine)\",\n    \"path\": \"/usr/bin/wine64\"\n}\n
    "},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
    "},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application putty-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
    "},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
    "},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
    "},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"

    ubuntu

    "},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"
    qelectrotech\n
    "},{"location":"applications/qelectrotech/#path","title":"Path","text":"
    /usr/bin/qelectrotech\n
    "},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"
    qelectrotech.Qelectrotech\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/qelectrotech/#json-dump","title":"JSON dump","text":"

    json source file qelectrotech.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qelectrotech\",\n    \"icon\": \"qelectrotech.svg\",\n    \"keyword\": \"qelectrotech\",\n    \"launch\": \"qelectrotech.Qelectrotech\",\n    \"name\": \"qElectrotech\",\n    \"path\": \"/usr/bin/qelectrotech\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
    "},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
    "},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application qElectrotech

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
    "},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
    "},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
    "},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"
    Remarkable\n
    "},{"location":"applications/remarkable/#path","title":"Path","text":"
    /usr/bin/remarkable\n
    "},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"
    text/x-markdown;text/markdown;\n
    "},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"

    \"md;markdown\"

    "},{"location":"applications/remarkable/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"md;markdown\"

    "},{"location":"applications/remarkable/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"
    remarkable.Remarkable\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remarkable/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remarkable.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"

    json source file remarkable.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"remarkable.svg\",\n    \"keyword\": \"markdown,editor\",\n    \"launch\": \"remarkable.Remarkable\",\n    \"name\": \"remarkable\",\n    \"displayname\": \"Remarkable\",\n    \"path\": \"/usr/bin/remarkable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/x-markdown;text/markdown;\",\n    \"legacyfileextensions\": \"md;markdown\",\n    \"fileextensions\": \"md;markdown\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
    "},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remarkable

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
    "},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
    "},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
    "},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/remmina/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"
    remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
    "},{"location":"applications/remmina/#displayname","title":"Displayname","text":"
    Remmina\n
    "},{"location":"applications/remmina/#path","title":"Path","text":"
    /usr/bin/remmina\n
    "},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"
    application/x-remmina;\n
    "},{"location":"applications/remmina/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"
    remmina.Remmina\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remmina/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remmina-file.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"

    json source file remmina.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n    \"icon\": \"remmina.svg\",\n    \"keyword\": \"rdp,tsclient\",\n    \"launch\": \"remmina.Remmina\",\n    \"name\": \"remmina\",\n    \"displayname\": \"Remmina\",\n    \"args\": \"\",\n    \"path\": \"/usr/bin/remmina\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/x-remmina;\",\n    \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"usedefaultapplication\": true\n}\n
    "},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
    "},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remmina

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
    "},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
    "},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
    "},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"
    gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
    "},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"
    RemoteDesktop\n
    "},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"
    /bin/remotedesktopmanager.free\n
    "},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"
    RemoteDesktopManager.Free.RemoteDesktopManager.Free\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/remotedesktopmanager/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/remotedesktopmanager.free.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
    "},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"

    json source file remotedesktopmanager.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n    \"icon\": \"circle-remotedesktopmanager.svg\",\n    \"keyword\": \"remote,desktop,ssh\",\n    \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n    \"name\": \"remotedesktopmanager\",\n    \"displayname\": \"RemoteDesktop\",\n    \"path\": \"/bin/remotedesktopmanager.free\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"\",\n    \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n        \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n        \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n    ]\n}\n
    "},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
    "},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application remotedesktopmanager

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
    "},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
    "},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
    "},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"
    rhythmbox\n
    "},{"location":"applications/rhythmbox/#path","title":"Path","text":"
    /usr/bin/rhythmbox\n
    "},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"
    application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
    "},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"
    rhythmbox.Rhythmbox\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/rhythmbox/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Rhythmbox3.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"

    json source file rhythmbox.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"rhythmbox\",\n    \"icon\": \"circle_rhythmbox.svg\",\n    \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n    \"launch\": \"rhythmbox.Rhythmbox\",\n    \"name\": \"rhythmbox\",\n    \"path\": \"/usr/bin/rhythmbox\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
    "},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
    "},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application rhythmbox

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
    "},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
    "},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
    "},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/robots/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-robots\n
    "},{"location":"applications/robots/#path","title":"Path","text":"
    /usr/games/gnome-robots\n
    "},{"location":"applications/robots/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"
    gnome-robots.Gnome-robots\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/robots/#desktopfile","title":"Desktopfile","text":"
    gnome-robots.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"

    json source file robots.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-robots\",\n    \"icon\": \"circle_gnome-robots.svg\",\n    \"keyword\": \"gnome robots,game robots,robots\",\n    \"launch\": \"gnome-robots.Gnome-robots\",\n    \"name\": \"Robots\",\n    \"path\": \"/usr/games/gnome-robots\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"gnome-robots.desktop\"\n}\n
    "},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
    "},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Robots

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
    "},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
    "},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
    "},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"
    shotcut mesa-dri-gallium\n
    "},{"location":"applications/shotcut/#path","title":"Path","text":"
    /usr/bin/shotcut\n
    "},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"
    image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
    "},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"

    \"mlt\"

    "},{"location":"applications/shotcut/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"mlt\"

    "},{"location":"applications/shotcut/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"
    shotcut.Shotcut\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/shotcut/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.shotcut.Shotcut.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"

    json source file shotcut.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"shotcut mesa-dri-gallium\",\n    \"icon\": \"circle_shotcut.svg\",\n    \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n    \"launch\": \"shotcut.Shotcut\",\n    \"name\": \"Shotcut\",\n    \"path\": \"/usr/bin/shotcut\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n    \"fileextensions\": \"mlt\",\n    \"legacyfileextensions\": \"mlt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
    "},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Shotcut

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
    "},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
    "},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
    "},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"
    stellarium\n
    "},{"location":"applications/stellarium/#path","title":"Path","text":"
    /usr/bin/stellarium\n
    "},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"
    application/x-stellarium-script;\n
    "},{"location":"applications/stellarium/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"
    stellarium.stellarium\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/stellarium/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.stellarium.Stellarium.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"

    json source file stellarium.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"stellarium\",\n    \"icon\": \"stellarium.svg\",\n    \"keyword\": \"stellarium,astronomy\",\n    \"launch\": \"stellarium.stellarium\",\n    \"name\": \"Stellarium\",\n    \"path\": \"/usr/bin/stellarium\",\n    \"mimetype\": \"application/x-stellarium-script;\",\n    \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
    "},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Stellarium

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
    "},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
    "},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
    "},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/step/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"
    step\n
    "},{"location":"applications/step/#path","title":"Path","text":"
    /usr/bin/step\n
    "},{"location":"applications/step/#mimetype","title":"Mimetype","text":"
    application/x-step;\n
    "},{"location":"applications/step/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"
    step.step\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/step/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.kde.step.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/step/#json-dump","title":"JSON dump","text":"

    json source file step.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"step\",\n    \"icon\": \"step.svg\",\n    \"keyword\": \"step\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"launch\": \"step.step\",\n    \"name\": \"Step\",\n    \"path\": \"/usr/bin/step\",\n    \"mimetype\": \"application/x-step;\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
    "},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
    "},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Step

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
    "},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
    "},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
    "},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/stress/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"
    at-spi2-core gnome-terminal dbus-x11 stress\n
    "},{"location":"applications/stress/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=stress\"

    "},{"location":"applications/stress/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/stress/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.stress\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/stress/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/gnome-terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"

    json source file stress.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n    \"icon\": \"stress.svg\",\n    \"keyword\": \"stress,cpu,shell\",\n    \"launch\": \"gnome-terminal-server.stress\",\n    \"name\": \"stress\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=stress\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
    "},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
    "},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application stress

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
    "},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
    "},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
    "},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"
    sublime-text\n
    "},{"location":"applications/sublime-text/#path","title":"Path","text":"
    /opt/sublime_text/sublime_text\n
    "},{"location":"applications/sublime-text/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"
    sublime_text.Sublime_text\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/sublime-text/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/sublime_text.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
    "},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"

    json source file sublime-text.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n        \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n    ],\n    \"debpackage\": \"sublime-text\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_sublime-text.svg\",\n    \"keyword\": \"ide,code,sublime-text\",\n    \"launch\": \"sublime_text.Sublime_text\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"sublime-Text\",\n    \"path\": \"/opt/sublime_text/sublime_text\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
    "},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
    "},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application sublime-Text

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
    "},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
    "},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
    "},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"
    gnome-sudoku\n
    "},{"location":"applications/sudoku/#path","title":"Path","text":"
    /usr/bin/gnome-sudoku\n
    "},{"location":"applications/sudoku/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Sudoku.org.gnome.Sudoku\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/sudoku/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Sudoku.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"

    json source file sudoku.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-sudoku\",\n    \"icon\": \"org.gnome.Sudoku.svg\",\n    \"keyword\": \"sudoku\",\n    \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n    \"name\": \"sudoku\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-sudoku\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
    "},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
    "},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application sudoku

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
    "},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
    "},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
    "},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpinei.minimal

    "},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"

    alpine

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"
    supertux mesa-gl mesa-egl mesa-dri-gallium\n
    "},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"
    supertux2\n
    "},{"location":"applications/supertux2/#path","title":"Path","text":"
    /usr/games/supertux2\n
    "},{"location":"applications/supertux2/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"
    supertux2.supertux2\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/supertux2/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/supertux2.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"

    json source file supertux2.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n    \"icon\": \"circle_supertux.svg\",\n    \"keyword\": \"supertux\",\n    \"launch\": \"supertux2.supertux2\",\n    \"name\": \"supertux2\",\n    \"displayname\": \"supertux2\",\n    \"path\": \"/usr/games/supertux2\",\n    \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n    \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
    "},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
    "},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application supertux2

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
    "},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
    "},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
    "},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"
    swell-foop\n
    "},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"
    swell-foop\n
    "},{"location":"applications/swell-foop/#path","title":"Path","text":"
    /usr/games/swell-foop\n
    "},{"location":"applications/swell-foop/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"
    swell-foop.Swell-foop\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/swell-foop/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.SwellFoop.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"

    json source file swell-foop.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"swell-foop\",\n    \"icon\": \"circle_swell-foop.svg\",\n    \"keyword\": \"swell,foop\",\n    \"launch\": \"swell-foop.Swell-foop\",\n    \"name\": \"swell-foop\",\n    \"displayname\": \"swell-foop\",\n    \"path\": \"/usr/games/swell-foop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
    "},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
    "},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application swell-foop

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
    "},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
    "},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
    "},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/taquin/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"
    gnome-taquin\n
    "},{"location":"applications/taquin/#path","title":"Path","text":"
    /usr/bin/gnome-taquin\n
    "},{"location":"applications/taquin/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Taquin.org.gnome.Weather\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/taquin/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Taquin.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"

    json source file taquin.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-taquin\",\n    \"icon\": \"org.gnome.Taquin.svg\",\n    \"keyword\": \"taquin\",\n    \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n    \"name\": \"taquin\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-taquin\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
    "},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
    "},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application taquin

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
    "},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
    "},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
    "},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/teams/#arguments","title":"Arguments","text":"

    \"--disable-namespace-sandbox --disable-setuid-sandbox\"

    "},{"location":"applications/teams/#displayname","title":"Displayname","text":"
    Microsoft Teams\n
    "},{"location":"applications/teams/#path","title":"Path","text":"
    /usr/bin/teams\n
    "},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/msteams;\n
    "},{"location":"applications/teams/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"
    microsoft teams - preview.Microsoft Teams - Preview\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/teams/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/teams.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"

    json source file teams.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"icon\": \"teams.svg\",\n    \"keyword\": \"teams\",\n    \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n    \"name\": \"teams\",\n    \"displayname\": \"Microsoft Teams\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/teams\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/msteams;\",\n    \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
    "},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application teams

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
    "},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
    "},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
    "},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/terminal/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
    "},{"location":"applications/terminal/#arguments","title":"Arguments","text":"

    \"--disable-factory\"

    "},{"location":"applications/terminal/#displayname","title":"Displayname","text":"
    Terminal sudo\n
    "},{"location":"applications/terminal/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminal/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/terminal/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.Gnome-terminal\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminal/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
    "},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"

    json source file terminal.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n    \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n    \"name\": \"Terminal\",\n    \"displayname\": \"Terminal sudo\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
    "},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
    "},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Terminal

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
    "},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
    "},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
    "},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.gtk.fulldev.ia

    "},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"

    gnome-terminal dbus-x11

    "},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=terminalai\"

    "},{"location":"applications/terminalai/#display-name","title":"Display name","text":"

    \"Shell AI\"

    "},{"location":"applications/terminalai/#path","title":"path","text":"

    \"/usr/bin/gnome-terminal\"

    "},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"
    at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
    "},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=ephemeral\"

    "},{"location":"applications/terminalephemeral/#displayname","title":"Displayname","text":"
    Terminal [ephemeral container]\n
    "},{"location":"applications/terminalephemeral/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.ephemeral\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminalephemeral/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"

    json source file terminalephemeral.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"ephemeral,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.ephemeral\",\n    \"name\": \"terminalephemeral\",\n    \"displayname\": \"Terminal [ephemeral container]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=ephemeral\",\n    \"containerengine\": \"ephemeral_container\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
    "},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
    "},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application terminalephemeral

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
    "},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
    "},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
    "},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"
    pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
    "},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"

    \"--disable-factory --class=pod\"

    "},{"location":"applications/terminalpod/#displayname","title":"Displayname","text":"
    Terminal [Pod]\n
    "},{"location":"applications/terminalpod/#path","title":"Path","text":"
    /usr/bin/gnome-terminal\n
    "},{"location":"applications/terminalpod/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"
    gnome-terminal-server.pod\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/terminalpod/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Terminal.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"

    json source file terminalpod.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"pod,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.pod\",\n    \"name\": \"terminalpod\",\n    \"displayname\": \"Terminal [Pod]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=pod\",\n    \"containerengine\": \"pod_application\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
    "},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
    "},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application terminalpod

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
    "},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
    "},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
    "},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

    "},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"
    gnome-tetravex\n
    "},{"location":"applications/tetravex/#path","title":"Path","text":"
    /usr/games/gnome-tetravex\n
    "},{"location":"applications/tetravex/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"
    gnome-tetravex.Gnome-tetravex\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/tetravex/#json-dump","title":"JSON dump","text":"

    json source file tetravex.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-tetravex\",\n    \"icon\": \"gnome-tetravex.svg\",\n    \"keyword\": \"game\",\n    \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n    \"name\": \"Tetravex\",\n    \"path\": \"/usr/games/gnome-tetravex\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktop\": \"gnome-tetravex.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    }\n}\n
    "},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
    "},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application Tetravex

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
    "},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
    "},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
    "},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"
    tk thunderbird gnome-keyring\n
    "},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"
    Thunderbird\n
    "},{"location":"applications/thunderbird/#path","title":"Path","text":"
    /usr/bin/thunderbird\n
    "},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/mailto\n
    "},{"location":"applications/thunderbird/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"
    Mail.Thunderbird\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/thunderbird/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/thunderbird.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"

    json source file thunderbird.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"tk thunderbird gnome-keyring\",\n    \"icon\": \"thunderbird.svg\",\n    \"keyword\": \"mail\",\n    \"launch\": \"Mail.Thunderbird\",\n    \"name\": \"thunderbird\",\n    \"displayname\": \"Thunderbird\",\n    \"path\": \"/usr/bin/thunderbird\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/mailto\",\n    \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
    "},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
    "},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application thunderbird

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
    "},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
    "},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
    "},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.18.04

    "},{"location":"applications/vice/#displayname","title":"Displayname","text":"
    Commodore64\n
    "},{"location":"applications/vice/#path","title":"Path","text":"
    /usr/bin/x64\n
    "},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"

    \"crt;bin\"

    "},{"location":"applications/vice/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"
    x64.X64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vice/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/x64.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
    "},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"

    json source file vice.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n        \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n        \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"c64.svg\",\n    \"keyword\": \"x64,vice,commodore,c64\",\n    \"launch\": \"x64.X64\",\n    \"name\": \"vice\",\n    \"displayname\": \"Commodore64\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/x64\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"fileextensions\": \"crt;bin\",\n    \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n    \"usedefaultapplication\": false\n}\n
    "},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
    "},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vice

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
    "},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
    "},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
    "},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/vlc/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"
    ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
    "},{"location":"applications/vlc/#displayname","title":"Displayname","text":"
    videolan\n
    "},{"location":"applications/vlc/#path","title":"Path","text":"
    /usr/bin/vlc\n
    "},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"
    video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
    "},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"

    \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"

    "},{"location":"applications/vlc/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"
    vlc.vlc\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vlc/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/vlc.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"

    json source file vlc.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office,graphics\",\n    \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n    \"icon\": \"circle_vlc.svg\",\n    \"keyword\": \"vlc, videolan, video, lan, dvd\",\n    \"launch\": \"vlc.vlc\",\n    \"name\": \"vlc\",\n    \"displayname\": \"videolan\",\n    \"path\": \"/usr/bin/vlc\",\n    \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n    \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n    \"quick\": true\n}\n
    "},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
    "},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vlc

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
    "},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
    "},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
    "},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"

    abcdesktop/docker-osx

    "},{"location":"applications/vmmacos/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"
    qemu.Qemu-system-x86_64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmmacos/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN yes | sudo pacman -S xorg-xauth\n
    "},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"

    json source file vmmacos.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"RUN yes | sudo pacman -S xorg-xauth\"\n    ],\n    \"icon\": \"MacOS_logo.svg\",\n    \"keyword\": \"macos,apple\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmmacos\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktop/docker-osx\",\n    \"workdir\": \"/home/arch/OSX-KVM\",\n    \"user\": \"arch\",\n    \"home\": \"/home/arch\",\n    \"cmd\": [\n        \"/bin/bash\",\n        \"-c\",\n        \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true     ; [[ \\\"${NOPICKER}\\\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\"     ; }     || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"     ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\\\"${MASTER_PLIST_URL}\\\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\"   --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"             --output-env \\\"${ENV:=/env}\\\" || exit 1 ; }     ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && {             source \\\"${ENV:=/env}\\\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\"             --serial \\\"${SERIAL}\\\"             --board-serial \\\"${BOARD_SERIAL}\\\"             --uuid \\\"${UUID}\\\"             --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\"             --height \\\"${HEIGHT:-1080}\\\"             --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\"\n    ]\n}\n
    "},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
    "},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true     ; [[ \"${NOPICKER}\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\"     ; }     || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"     ; [[ \"${GENERATE_UNIQUE}\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\"${MASTER_PLIST_URL}\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\"   --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"             --output-env \"${ENV:=/env}\" || exit 1 ; }     ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && {             source \"${ENV:=/env}\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\"             --serial \"${SERIAL}\"             --board-serial \"${BOARD_SERIAL}\"             --uuid \"${UUID}\"             --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\"             --height \"${HEIGHT:-1080}\"             --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\" ]\n\n
    "},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmmacos

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
    "},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
    "},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
    "},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/vmrc/#licence","title":"Licence","text":"

    ** This application is NO FREE. ** You need to build it manually.

    "},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"
    VMRC\n
    "},{"location":"applications/vmrc/#path","title":"Path","text":"
    /usr/bin/vmrc\n
    "},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/vmrc;\n
    "},{"location":"applications/vmrc/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"
    vmrc.Vmrc\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmrc/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/vmware-vmrc.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
    "},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"

    json source file vmrc.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_vmware.svg\",\n    \"keyword\": \"vmrc,vmware,remote,console\",\n    \"launch\": \"vmrc.Vmrc\",\n    \"name\": \"vmrc\",\n    \"displayname\": \"VMRC\",\n    \"path\": \"/usr/bin/vmrc\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"x-scheme-handler/vmrc;\",\n    \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\",\n        \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n        \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n        \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n    ]\n}\n
    "},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
    "},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmrc

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
    "},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
    "},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
    "},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.vm.ubuntu:22.04

    "},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"
    qemu.Qemu-system-x86_64\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vmubuntu/#json-dump","title":"JSON dump","text":"

    json source file vmubuntu.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"icon\": \"vm-linux-ubuntu.svg\",\n    \"keyword\": \"vm,ubuntu,jammy\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmubuntu\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n    \"home\": \"/home/balloon\",\n    \"cmd\": \"/docker-entrypoint.sh\"\n}\n
    "},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
    "},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application vmubuntu

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
    "},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
    "},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
    "},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/vscode/#arguments","title":"Arguments","text":"

    \"--extensions-dir /usr/share/code/extensions --verbose\"

    "},{"location":"applications/vscode/#path","title":"Path","text":"
    /usr/bin/code\n
    "},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"
    text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
    "},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"

    \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"

    "},{"location":"applications/vscode/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"c;cpp;py;json;java;md;yml;yaml;\"

    "},{"location":"applications/vscode/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"
    code.Code\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/vscode/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/code.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
    "},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"

    json source file vscode.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_visual-studio-code.svg\",\n    \"keyword\": \"ide,vscode,visual studio code,code\",\n    \"launch\": \"code.Code\",\n    \"name\": \"VSCode\",\n    \"path\": \"/usr/bin/code\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"code.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"cap_add\": [\n            \"SYS_ADMIN\"\n        ]\n    },\n    \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n    \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n    \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n    \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n    \"desktopfile\": \"/usr/share/applications/code.desktop\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n    ],\n    \"quick\": true\n}\n
    "},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
    "},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application VSCode

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
    "},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
    "},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
    "},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/weather/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"
    gnome-weather\n
    "},{"location":"applications/weather/#path","title":"Path","text":"
    /usr/bin/gnome-weather\n
    "},{"location":"applications/weather/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"
    org.gnome.Weather.org.gnome.Weather\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/weather/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.gnome.Weather.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"

    json source file weather.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnome-weather\",\n    \"icon\": \"org.gnome.Weather.svg\",\n    \"keyword\": \"weather\",\n    \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n    \"name\": \"weather\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-weather\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
    "},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
    "},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application weather

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
    "},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
    "},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
    "},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"
    dbus-x11\n
    "},{"location":"applications/whatsdesk/#path","title":"Path","text":"
    /opt/whatsdesk/whatsdesk\n
    "},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"
    x-scheme-handler/whatsapp;\n
    "},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"
    whatsdesk.whatsdesk\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/whatsdesk/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/whatsdesk.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
    "},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"

    json source file whatsdesk.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"dbus-x11\",\n    \"icon\": \"whatsapp.svg\",\n    \"keyword\": \"whatsapp,whatsdesk\",\n    \"launch\": \"whatsdesk.whatsdesk\",\n    \"name\": \"whatsdesk\",\n    \"path\": \"/opt/whatsdesk/whatsdesk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n    \"mimetype\": \"x-scheme-handler/whatsapp;\",\n    \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
    "},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
    "},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application whatsdesk

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
    "},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
    "},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
    "},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"
    Winefile Wine (alpine)\n
    "},{"location":"applications/winefile-wine/#path","title":"Path","text":"
    /usr/bin/winefile\n
    "},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"
    winefile.exe.winefile.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winefile-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
    "},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"

    json source file winefile-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"winefile.svg\",\n    \"keyword\": \"wine,winfile,winefile,file,manager\",\n    \"launch\": \"winefile.exe.winefile.exe\",\n    \"name\": \"winefile-wine\",\n    \"displayname\": \"Winefile Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winefile\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
    "},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winefile-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
    "},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
    "},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
    "},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.wine

    "},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"
    wine\n
    "},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"
    WineMine Wine (alpine)\n
    "},{"location":"applications/winemine-wine/#path","title":"Path","text":"
    /usr/bin/winemine\n
    "},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"
    winemine.exe.winemine.exe\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winemine-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
    "},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"

    json source file winemine-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"wine\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n    ],\n    \"icon\": \"winemine.svg\",\n    \"keyword\": \"wine,winemine,mine\",\n    \"launch\": \"winemine.exe.winemine.exe\",\n    \"name\": \"winemine-wine\",\n    \"displayname\": \"WineMine Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winemine\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
    "},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
    "},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winemine-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
    "},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
    "},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
    "},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.wine

    "},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"

    \"winhelp\"

    "},{"location":"applications/winhelp-wine/#displayname","title":"Displayname","text":"
    Winhelp Wine\n
    "},{"location":"applications/winhelp-wine/#path","title":"Path","text":"
    /usr/bin/wine\n
    "},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"
    application/hlp;\n
    "},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"

    \"hlp;\"

    "},{"location":"applications/winhelp-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"
    winhlp32.exe.Wine\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winhelp-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
    "},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"

    json source file winhelp-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"winhelp\",\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"winhelp.svg\",\n    \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n    \"launch\": \"winhlp32.exe.Wine\",\n    \"name\": \"winhelp-wine\",\n    \"displayname\": \"Winhelp Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/wine\",\n    \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
    "},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
    "},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winhelp-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
    "},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
    "},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
    "},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.wine

    "},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"

    \"/composer/bin/winscp.exe\"

    "},{"location":"applications/winscp-wine/#displayname","title":"Displayname","text":"
    WinSCP\n
    "},{"location":"applications/winscp-wine/#path","title":"Path","text":"
    /usr/bin/wine\n
    "},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"
    winscp.exe.Wine\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/winscp-wine/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
    "},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"

    json source file winscp-wine.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.wine\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"args\": \"/composer/bin/winscp.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"winscp.svg\",\n    \"keyword\": \"wine,scp,sftp\",\n    \"launch\": \"winscp.exe.Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"winscp-wine\",\n    \"displayname\": \"WinSCP\",\n    \"path\": \"/usr/bin/wine\"\n}\n
    "},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
    "},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application winscp-wine

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
    "},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
    "},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
    "},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.gtk

    "},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"
    wireshark\n
    "},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"
    wireshark (alpine)\n
    "},{"location":"applications/wireshark/#path","title":"Path","text":"
    /usr/bin/wireshark\n
    "},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"
    application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
    "},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"

    \"cap,pcap\"

    "},{"location":"applications/wireshark/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"cap\"

    "},{"location":"applications/wireshark/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"
    wireshark.Wireshark\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/wireshark/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/org.wireshark.Wireshark.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    ENV QT_XCB_NO_MITSHM=1\n
    "},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"

    json source file wireshark.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV QT_XCB_NO_MITSHM=1\"\n    ],\n    \"apkpackage\": \"wireshark\",\n    \"icon\": \"wireshark.svg\",\n    \"keyword\": \"capture,network,analyzer\",\n    \"launch\": \"wireshark.Wireshark\",\n    \"name\": \"wireshark\",\n    \"displayname\": \"wireshark (alpine)\",\n    \"path\": \"/usr/bin/wireshark\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n    \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n    \"fileextensions\": \"cap,pcap\",\n    \"legacyfileextensions\": \"cap\"\n}\n
    "},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
    "},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application wireshark

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
    "},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
    "},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
    "},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.libreoffice

    "},{"location":"applications/writer/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"
    libreoffice-gnome\n
    "},{"location":"applications/writer/#arguments","title":"Arguments","text":"

    \"--writer\"

    "},{"location":"applications/writer/#displayname","title":"Displayname","text":"
    Writer alpine\n
    "},{"location":"applications/writer/#path","title":"Path","text":"
    /usr/lib/libreoffice/program/soffice\n
    "},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"

    \"libreoffice\"

    "},{"location":"applications/writer/#showinview","title":"Showinview","text":"

    \"dock\"

    "},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"
    application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
    "},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"

    \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"

    "},{"location":"applications/writer/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"odf;ott;fodt;uot\"

    "},{"location":"applications/writer/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"
    libreoffice.libreoffice-writer\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/writer/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/libreoffice-writer.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"

    json source file writer.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_writer.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-writer\",\n    \"name\": \"writer\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Writer alpine\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"args\": \"--writer\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n    \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n    \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
    "},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
    "},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application writer

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
    "},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
    "},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
    "},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/xclock/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"
    xclock\n
    "},{"location":"applications/xclock/#displayname","title":"Displayname","text":"
    Xclock\n
    "},{"location":"applications/xclock/#path","title":"Path","text":"
    /usr/bin/xclock\n
    "},{"location":"applications/xclock/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"
    xclock.XClock\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xclock/#json-dump","title":"JSON dump","text":"

    json source file xclock.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"xclock\",\n    \"icon\": \"xclock.svg\",\n    \"keyword\": \"clock,xclock,time\",\n    \"launch\": \"xclock.XClock\",\n    \"name\": \"xclock\",\n    \"displayname\": \"Xclock\",\n    \"path\": \"/usr/bin/xclock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
    "},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xclock

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
    "},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
    "},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
    "},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/xedit/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"
    x11-apps x11-utils xbitmaps\n
    "},{"location":"applications/xedit/#displayname","title":"Displayname","text":"
    Xedit\n
    "},{"location":"applications/xedit/#path","title":"Path","text":"
    /usr/bin/xedit\n
    "},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"
    application/text;\n
    "},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"

    \"txt;log;md\"

    "},{"location":"applications/xedit/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"
    xedit.Xedit\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xedit/#json-dump","title":"JSON dump","text":"

    json source file xedit.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n    \"icon\": \"circle_xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;md\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
    "},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xedit

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
    "},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
    "},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
    "},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"
    xeyes\n
    "},{"location":"applications/xeyes/#path","title":"Path","text":"
    /usr/bin/xeyes\n
    "},{"location":"applications/xeyes/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"
    xeyes.XEyes\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xeyes/#json-dump","title":"JSON dump","text":"

    json source file xeyes.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"xeyes\",\n    \"icon\": \"circle_xfce4-eyes.svg\",\n    \"keyword\": \"eyes\",\n    \"launch\": \"xeyes.XEyes\",\n    \"name\": \"xeyes\",\n    \"path\": \"/usr/bin/xeyes\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
    "},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
    "},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xeyes

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
    "},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
    "},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
    "},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/xman/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"
    x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
    "},{"location":"applications/xman/#displayname","title":"Displayname","text":"
    Xman\n
    "},{"location":"applications/xman/#path","title":"Path","text":"
    /usr/bin/xman\n
    "},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"
    application/x-troff;application/x-troff-man;\n
    "},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"

    \"man;roff\"

    "},{"location":"applications/xman/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"
    topBox.Xman\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xman/#json-dump","title":"JSON dump","text":"

    json source file xman.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n    \"icon\": \"circle_xorg.svg\",\n    \"keyword\": \"man,xman,help\",\n    \"launch\": \"topBox.Xman\",\n    \"name\": \"xman\",\n    \"displayname\": \"Xman\",\n    \"path\": \"/usr/bin/xman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n    \"fileextensions\": \"man;roff\",\n    \"args\": \"\"\n}\n
    "},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
    "},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xman

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
    "},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
    "},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
    "},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/xpad/#distribution","title":"Distribution","text":"

    ubuntu

    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"
    xpad\n
    "},{"location":"applications/xpad/#displayname","title":"Displayname","text":"
    Xpad\n
    "},{"location":"applications/xpad/#path","title":"Path","text":"
    /usr/bin/xpad\n
    "},{"location":"applications/xpad/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"
    xpad.xpad\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xpad/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/xpad.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
    "},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"

    json source file xpad.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"xpad\",\n    \"icon\": \"xpad.svg\",\n    \"keyword\": \"xpad, note, sticky, postit\",\n    \"launch\": \"xpad.xpad\",\n    \"name\": \"xpad\",\n    \"displayname\": \"Xpad\",\n    \"path\": \"/usr/bin/xpad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n    ]\n}\n
    "},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
    "},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xpad

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
    "},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
    "},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
    "},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.alpine

    "},{"location":"applications/xterm/#distribution","title":"Distribution","text":"

    alpine

    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"
    xterm sudo\n
    "},{"location":"applications/xterm/#arguments","title":"Arguments","text":"

    \"-xrm 'XTerm*selectToClipboard:true'\"

    "},{"location":"applications/xterm/#displayname","title":"Displayname","text":"
    Xterm (sudo)\n
    "},{"location":"applications/xterm/#path","title":"Path","text":"
    /usr/bin/xterm\n
    "},{"location":"applications/xterm/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"
    xterm.XTerm\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/xterm/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/xterm.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"

    POST run command are run after the package install comman

    RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
    "},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"

    json source file xterm.d.3.0.json

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"circle_xterm.svg\",\n    \"apkpackage\": \"xterm sudo\",\n    \"keyword\": \"xterm,shell,cmd\",\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"xterm\",\n    \"displayname\": \"Xterm (sudo)\",\n    \"path\": \"/usr/bin/xterm\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n    \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"quick\": true\n}\n
    "},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
    "},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application xterm

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
    "},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
    "},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
    "},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"

    abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/youtube/#distribution","title":"Distribution","text":"

    ubuntu

    PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"
    firefox\n
    "},{"location":"applications/youtube/#arguments","title":"Arguments","text":"

    \"-P youtube --class=youtube https://www.youtube.com/\"

    "},{"location":"applications/youtube/#displayname","title":"Displayname","text":"
    Youtube\n
    "},{"location":"applications/youtube/#path","title":"Path","text":"
    /usr/bin/firefox\n
    "},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"
    text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
    "},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"

    \"html;xml;gif\"

    "},{"location":"applications/youtube/#legacy-file-extensions","title":"Legacy file extensions","text":"

    \"html;xml\"

    "},{"location":"applications/youtube/#acl","title":"ACL","text":"
    {\n    \"permit\": [\n        \"all\"\n    ]\n}\n
    "},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"
    Navigator.youtube\n

    The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

    "},{"location":"applications/youtube/#desktopfile","title":"Desktopfile","text":"
    /usr/share/applications/firefox.desktop\n

    A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

    "},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"

    PRE run command are run before the package install command

    COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
    "},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"

    json source file

    {\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"firefox\",\n    \"icon\": \"circle_youtube.svg\",\n    \"keyword\": \"youtube,tube\",\n    \"launch\": \"Navigator.youtube\",\n    \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n    \"name\": \"youtube\",\n    \"displayname\": \"Youtube\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\"\n    },\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"preventhomemount\": false,\n    \"quick\": true,\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n    ]\n}\n
    "},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"

    Replace the ABCHOST var set to localhost by default to your own server ip address

    ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
    "},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
    # Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
    "},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

    Dockerfile for application youtube

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
    "},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
    docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
    "},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"

    If you are using containerd as container runtime, use the ctr command line

    If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

    ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.3.17

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.3.17.md is created at Sat Nov 30 2024 22:37:24 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.3.18

    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.9\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.3.18.md is created at Sat Nov 30 2024 22:37:15 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.edge.gtk

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

    file oc.template.alpine.edge.gtk.libreoffice.md is created at Sun Dec 01 2024 12:08:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

    file oc.template.alpine.edge.gtk.md is created at Sun Dec 01 2024 11:56:35 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal.edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.edge.md is created at Sat Nov 30 2024 22:37:13 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

    file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

    file oc.template.alpine.libreoffice.md is created at Sun Dec 01 2024 12:08:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine.minimal

    "},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

    file oc.template.alpine.md is created at Sat Nov 30 2024 22:37:29 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"

    Docker official images alpine:3.17

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.10\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.17.md is created at Sat Nov 30 2024 22:23:01 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"

    Docker official images alpine:3.18

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.9\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.18.md is created at Sat Nov 30 2024 22:22:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/","title":"oc.template.alpine.minimal.3.19","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#from","title":"from","text":"

    Docker official images alpine:3.19

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.4\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.19/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.19.md is created at Sat Nov 30 2024 22:22:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/","title":"oc.template.alpine.minimal.3.20","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#from","title":"from","text":"

    Docker official images alpine:3.20

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.20/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.3.20.md is created at Sat Nov 30 2024 22:22:59 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"

    Docker official images alpine:edge

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.21.0_alpha20240807\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.edge.md is created at Sat Nov 30 2024 22:23:11 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"

    Docker official images alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

    file oc.template.alpine.minimal.md is created at Sat Nov 30 2024 22:23:07 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.alpine

    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.3\nPRETTY_NAME=\"Alpine Linux v3.20\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64'  ]; then apk add --no-cache --update wine; fi\n\n

    file oc.template.alpine.wine.md is created at Sun Dec 01 2024 12:10:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.debian

    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.debian.gtk.md is created at Sun Dec 01 2024 12:02:41 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.debian.minimal

    "},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.debian.md is created at Sat Nov 30 2024 22:37:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"

    Docker official images debian:stable-slim

    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
    \nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg                              \\\n     software-properties-common         \\\n     locales                \\\n     cups-client            \\\n     libpulse0              \\\n     curl               \\\n     xauth              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_20.x | bash - \\\n        && apt-get update && \\\n        apt-get install -y --no-install-recommends \\\n        nodejs \\\n    && apt-get clean \\\n    && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.debian.minimal.md is created at Sat Nov 30 2024 22:27:14 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/","title":"oc.template.rockylinux.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.minimal.8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add some fonts\nRUN yum update -y && \\\n    yum install -y \\\n        google-noto-fonts-common \\\n        xorg-x11-fonts-100dpi \\\n        xorg-x11-fonts-75dpi \\\n    texlive-utopia \\\n    liberation-fonts-common \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.8.md is created at Sat Nov 30 2024 22:38:32 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/","title":"oc.template.rockylinux.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.minimal.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    \n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add some fonts\nRUN yum update -y && \\\n    yum install -y \\\n        google-noto-fonts-common \\\n        xorg-x11-fonts-100dpi \\\n        xorg-x11-fonts-75dpi \\\n    texlive-utopia \\\n    liberation-fonts-common \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.9.md is created at Sat Nov 30 2024 22:38:15 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/","title":"oc.template.rockylinux.gtk.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y \\\n        gtk3 \\\n        gnome-font-viewer \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.rockylinux.gtk.8.md is created at Sun Dec 01 2024 11:57:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/","title":"oc.template.rockylinux.gtk.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y \\\n        gtk3 \\\n        gnome-font-viewer \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.rockylinux.gtk.9.md is created at Sun Dec 01 2024 12:00:39 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/","title":"oc.template.rockylinux.gtk.libreoffice.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.rockylinux.gtk.9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN yum update && \\\n     yum install -y --skip-broken libreoffice \\\n     && yum -y clean all \\\n     && rm -rf /var/cache\n\n

    file oc.template.rockylinux.gtk.libreoffice.9.md is created at Sun Dec 01 2024 12:09:21 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/","title":"oc.template.rockylinux.minimal.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#from","title":"from","text":"

    Docker official images rockylinux:8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.minimal.8.md is created at Sat Nov 30 2024 22:27:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/","title":"oc.template.rockylinux.minimal.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#from","title":"from","text":"

    Docker official images rockylinux:9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.minimal.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.minimal.9.md is created at Sat Nov 30 2024 22:25:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/","title":"oc.template.rockylinux.nvidia.8","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-rockylinux8

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"8.10 (Green Obsidian)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"8.10\"\nPLATFORM_ID=\"platform:el8\"\nPRETTY_NAME=\"Rocky Linux 8.10 (Green Obsidian)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:8:GA\"\nHOME_URL=\"https://rockylinux.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2029-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-8\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"8.10\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"8.10\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.8/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.nvidia.8.md is created at Sat Nov 30 2024 22:27:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/","title":"oc.template.rockylinux.nvidia.9","text":""},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-rockylinux9

    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Rocky Linux\"\nVERSION=\"9.5 (Blue Onyx)\"\nID=\"rocky\"\nID_LIKE=\"rhel centos fedora\"\nVERSION_ID=\"9.5\"\nPLATFORM_ID=\"platform:el9\"\nPRETTY_NAME=\"Rocky Linux 9.5 (Blue Onyx)\"\nANSI_COLOR=\"0;32\"\nLOGO=\"fedora-logo-icon\"\nCPE_NAME=\"cpe:/o:rocky:rocky:9::baseos\"\nHOME_URL=\"https://rockylinux.org/\"\nVENDOR_NAME=\"RESF\"\nVENDOR_URL=\"https://resf.org/\"\nBUG_REPORT_URL=\"https://bugs.rockylinux.org/\"\nSUPPORT_END=\"2032-05-31\"\nROCKY_SUPPORT_PRODUCT=\"Rocky-Linux-9\"\nROCKY_SUPPORT_PRODUCT_VERSION=\"9.5\"\nREDHAT_SUPPORT_PRODUCT=\"Rocky Linux\"\nREDHAT_SUPPORT_PRODUCT_VERSION=\"9.5\"\n\n
    "},{"location":"applications/abcdesktopio/oc.template.rockylinux.nvidia.9/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE=rockylinux:8\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY\n\nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n\nRUN  dnf update -y && \\\n     dnf install -y --allowerasing \\\n     glibc-langpack-en \\\n     cups-client \\\n     pulseaudio-libs \\\n     curl \\\n     xorg-x11-xauth \\\n     && dnf -y clean all \\\n     && rm -rf /var/cache \n\nENV LANG en_US.utf8\n\nCOPY composer /composer\n\nRUN    dnf update -y \\\n    && dnf module -y enable nodejs:18 \\\n    && dnf install -y nodejs \\ \n    && dnf clean -y all \\\n    && rm -rf /var/cache\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.rockylinux.nvidia.9.md is created at Sat Nov 30 2024 22:25:59 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.18.04.md is created at Sat Nov 30 2024 22:37:31 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.20.04.md is created at Sat Nov 30 2024 22:37:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.22.04.md is created at Sat Nov 30 2024 22:37:42 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/","title":"oc.template.ubuntu.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.minimal.24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

    file oc.template.ubuntu.24.04.md is created at Sat Nov 30 2024 22:38:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.18.04.md is created at Sun Dec 01 2024 11:59:18 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.20.04.md is created at Sun Dec 01 2024 11:59:16 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.5 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.5 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.22.04.md is created at Sun Dec 01 2024 12:00:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/","title":"oc.template.ubuntu.gtk.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 24.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"24.04\"\nVERSION=\"24.04.1 LTS (Noble Numbat)\"\nVERSION_CODENAME=noble\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=noble\nLOGO=ubuntu-logo\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.24.04.md is created at Sun Dec 01 2024 12:06:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n        default-jre \\\n        gsfonts-x11     \\\n    && rm -rf /var/lib/apt/lists/*  \n\n

    file oc.template.ubuntu.gtk.java.md is created at Sun Dec 01 2024 12:08:08 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.ubuntu.gtk

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive  \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y  --no-install-recommends                       \\\n        $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }')      \\\n        && apt-get clean                                        \\\n        && rm -rf /var/lib/apt/lists/*\n\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"

    inherite abcdesktopio/oc.template.ubuntu.gtk.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y                \\\n    at-spi2-core                        \\\n        libreoffice                         \\\n    libreoffice-gtk3                    \\\n    libreoffice-style-elementary                \\\n    libreoffice-base-drivers                \\\n    libreoffice-sdbc-hsqldb                 \\\n    libghc-hdbc-dev                     \\   \n    && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-help | awk '{print $1 }')    \\\n#   && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y   \\       \n#        $(apt-cache search myspell-dictionary | awk '{print $1 }')     \\\n#       && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends           \\       \n#        $(apt-cache search hyphen | awk '{print $1 }')                 \\\n#    && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n#    && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-l10n | awk '{print $1 }')    \\\n#    && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends    \\\n        xfonts-base \\\n        dbus-x11    \\\n    && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
    # default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     xfonts-base \\\n     xfonts-encodings \\\n     xfonts-scalable \\\n     xfonts-utils \\\n     fonts-dejavu-core  \\\n     fonts-droid-fallback \\\n     fonts-freefont-ttf \\\n     fonts-guru \\\n     fonts-guru-extra \\\n     fonts-liberation \\\n     fonts-liberation2 \\\n     fonts-noto \\\n     fonts-opensymbol \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

    file oc.template.ubuntu.gtk.md is created at Sun Dec 01 2024 11:59:37 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"

    Docker official images ubuntu:18.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.18.04.md is created at Sat Nov 30 2024 22:25:56 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"

    Docker official images ubuntu:20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.20.04.md is created at Sat Nov 30 2024 22:27:09 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"

    Docker official images ubuntu:22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.5 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.5 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.22.04.md is created at Sat Nov 30 2024 22:26:52 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/","title":"oc.template.ubuntu.minimal.24.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#from","title":"from","text":"

    Docker official images ubuntu:24.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 24.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"24.04\"\nVERSION=\"24.04.1 LTS (Noble Numbat)\"\nVERSION_CODENAME=noble\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=noble\nLOGO=ubuntu-logo\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.minimal.24.04.md is created at Sat Nov 30 2024 22:36:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-ubuntu20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.nvidia.20.04.md is created at Sat Nov 30 2024 22:26:17 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"

    inherit nvidia/cuda:12.4.1-base-ubuntu22.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"
    PRETTY_NAME=\"Ubuntu 22.04.4 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.4 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

    file oc.template.ubuntu.nvidia.22.04.md is created at Sat Nov 30 2024 22:26:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.20.04

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n       wget                             \\\n       && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n#   are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n#   for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aria2 \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes binutils \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n#    apt-get clean     \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes fuseiso && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes  p7zip-full policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#     apt-get install --no-install-recommends --yes  policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n#    apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n#    apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y   \\\n#   libnss-mdns-i386            \\\n#   libnss-mdns             \\ \n#   wine-stable &&          \\\n#   apt-get clean       \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb   &&  \\\n#     dpkg -i libfaudio0_19.07-0~bionic_amd64.deb                                           &&  \\\n#    rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb  &&  \\\n#    dpkg -i libfaudio0_19.07-0~bionic_i386.deb                                             &&  \\\n#    rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi      \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n    apt-get install --yes wine && \\\n    apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n    apt-get clean\n\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n    apt-get clean\n\nCOPY composer/updatereg.py              /composer\nCOPY composer/init.d/init.wine      /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine         /composer/init.d/_init.wine\nRUN  mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n

    file oc.template.ubuntu.wine.md is created at Sun Dec 01 2024 12:09:16 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"

    inherit abcdesktopio/oc.template.ubuntu.wine

    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"
    NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
    "},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile source code","text":"
    ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n    apt-get install --install-recommends -y \\\n    xterm \\\n    wget \\\n    netcat \\\n    file \\\n    winbind \\\n    gettext \\ \n    libgettextpo-dev \\\n    && rm -rf /var/lib/apt/lists/*  \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    libosmesa6:i386 \\\n        libnss-mdns \\\n    libnss-mdns:i386 \\\n    libncurses5:i386 \\\n    libodbc1:i386 \\\n    libxext6:i386 \\\n    libxi6:i386 \\\n    libfreetype6:i386 \\\n    libx11-6:i386 \\\n    libz1:i386 \\\n    libcups2:i386 \\\n    liblcms2-2:i386 \\\n    libglu1-mesa:i386 \\\n    libxcursor1:i386 \\\n    libxrandr2:i386 \\\n    libxml2:i386 \\\n    libgl1-mesa-dri:i386 \\\n    libgl1-mesa-glx:i386 \\\n    && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n   wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n   apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n   rm PlayOnLinux_4.3.4.deb && \\\n   rm -rf /var/lib/apt/lists/*\n\n

    file oc.template.ubuntu.wine.mswindow.md is created at Sun Dec 01 2024 12:11:26 GMT+0000 (Coordinated Universal Time) by make-docs.js

    "},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"
    #!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"
    NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"
    NAME=\"John\"\necho \"Hi $NAME\"  #=> Hi John\necho 'Hi $NAME'  #=> Hi $NAME\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"
    echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n

    See Command substitution

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"
    git commit && git push\ngit commit || echo \"Commit failed\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"

    {: id='functions-example'}

    get_name() {\n  echo \"John\"\n}\n\necho \"You are $(get_name)\"\n

    See: Functions

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"

    {: id='conditionals-example'}

    if [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n

    See: Conditionals

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"
    set -euo pipefail\nIFS=$'\\n\\t'\n

    See: Unofficial bash strict mode

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"
    echo {A,B}.js\n

    | {A,B} | Same as A B | | {A,B}.js | Same as A.js B.js | | {1..5} | Same as 1 2 3 4 5 |

    See: Brace expansion

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"
    name=\"John\"\necho ${name}\necho ${name/J/j}    #=> \"john\" (substitution)\necho ${name:0:2}    #=> \"Jo\" (slicing)\necho ${name::2}     #=> \"Jo\" (slicing)\necho ${name::-1}    #=> \"Joh\" (slicing)\necho ${name:(-1)}   #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake}  #=> $food or \"Cake\"\n
    length=2\necho ${name:0:length}  #=> \"Jo\"\n

    See: Parameter expansion

    STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp}    # /path/to/foo\necho ${STR%.cpp}.o  # /path/to/foo.o\n\necho ${STR##*.}     # cpp (extension)\necho ${STR##*/}     # foo.cpp (basepath)\n\necho ${STR#*/}      # path/to/foo.cpp\necho ${STR##*/}     # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
    STR=\"Hello world\"\necho ${STR:6:5}   # \"world\"\necho ${STR:-5:5}  # \"world\"\n
    SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/}   #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE}  #=> \"/path/to/\" (dirpath)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix} Remove suffix ${FOO#prefix} Remove prefix --- --- ${FOO%%suffix} Remove long suffix ${FOO##prefix} Remove long prefix --- --- ${FOO/from/to} Replace first match ${FOO//from/to} Replace all --- --- ${FOO/%from/to} Replace suffix ${FOO/#from/to} Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"
    # Single line comment\n
    : '\nThis is a\nmulti line\ncomment\n'\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"

    | ${FOO:0:3} | Substring (position, length) | | ${FOO:-3:3} | Substring from the right |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#length","title":"Length","text":"

    | ${#FOO} | Length of $FOO |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#manipulation","title":"Manipulation","text":"
    STR=\"HELLO WORLD!\"\necho ${STR,}   #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,}  #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^}   #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^}  #=> \"HELLO WORLD!\" (all uppercase)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"

    | ${FOO:-val} | $FOO, or val if not set | | ${FOO:=val} | Set $FOO to val if not set | | ${FOO:+val} | val if $FOO is set | | ${FOO:?message} | Show error message and exit if $FOO is not set |

    The : is optional (eg, ${FOO=word} works)

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#loops","title":"Loops","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"
    for i in /etc/rc.*; do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"
    for ((i = 0 ; i < 100 ; i++)); do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"
    for i in {1..5}; do\n    echo \"Welcome $i\"\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"
    for i in {5..50..5}; do\n    echo \"Welcome $i\"\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"
    cat file.txt | while read line; do\n  echo $line\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"
    while true; do\n  \u00b7\u00b7\u00b7\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"
    myfunc() {\n    echo \"hello $1\"\n}\n
    # Same as above (alternate syntax)\nfunction myfunc() {\n    echo \"hello $1\"\n}\n
    myfunc \"John\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"
    myfunc() {\n    local myresult='some value'\n    echo $myresult\n}\n
    result=\"$(myfunc)\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"
    myfunc() {\n  return 1\n}\n
    if myfunc; then\n  echo \"success\"\nelse\n  echo \"failure\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $# Number of arguments $* All arguments $@ All arguments, starting from first $1 First argument $_ Last argument of the previous command

    See Special parameters.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"

    Note that [[ is actually a command/program that returns either 0 (true) or 1 (false). Any program that obeys the same logic (like all base utils, such as grep(1) or ping(1)) can be used as condition, see examples.

    Condition Description [[ -z STRING ]] Empty string [[ -n STRING ]] Not empty string [[ STRING == STRING ]] Equal [[ STRING != STRING ]] Not Equal --- --- [[ NUM -eq NUM ]] Equal [[ NUM -ne NUM ]] Not equal [[ NUM -lt NUM ]] Less than [[ NUM -le NUM ]] Less than or equal [[ NUM -gt NUM ]] Greater than [[ NUM -ge NUM ]] Greater than or equal --- --- [[ STRING =~ STRING ]] Regexp --- --- (( NUM < NUM )) Numeric conditions Condition Description [[ -o noclobber ]] If OPTIONNAME is enabled --- --- [[ ! EXPR ]] Not [[ X ]] && [[ Y ]] And [[ X ]] || [[ Y ]] Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]] Exists [[ -r FILE ]] Readable [[ -h FILE ]] Symlink [[ -d FILE ]] Directory [[ -w FILE ]] Writable [[ -s FILE ]] Size is > 0 bytes [[ -f FILE ]] File [[ -x FILE ]] Executable --- --- [[ FILE1 -nt FILE2 ]] 1 is more recent than 2 [[ FILE1 -ot FILE2 ]] 2 is more recent than 1 [[ FILE1 -ef FILE2 ]] Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"
    # String\nif [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n
    # Combinations\nif [[ X ]] && [[ Y ]]; then\n  ...\nfi\n
    # Equal\nif [[ \"$A\" == \"$B\" ]]\n
    # Regex\nif [[ \"A\" =~ . ]]\n
    if (( $a < $b )); then\n   echo \"$a is smaller than $b\"\nfi\n
    if [[ -e \"file.txt\" ]]; then\n  echo \"file exists\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"
    Fruits=('Apple' 'Banana' 'Orange')\n
    Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"
    echo ${Fruits[0]}           # Element #0\necho ${Fruits[@]}           # All elements, space-separated\necho ${#Fruits[@]}          # Number of elements\necho ${#Fruits}             # String length of the 1st element\necho ${#Fruits[3]}          # String length of the Nth element\necho ${Fruits[@]:3:2}       # Range (from position 3, length 2)\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"
    Fruits=(\"${Fruits[@]}\" \"Watermelon\")    # Push\nFruits+=('Watermelon')                  # Also Push\nFruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match\nunset Fruits[2]                         # Remove one item\nFruits=(\"${Fruits[@]}\")                 # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`)                 # Read from file\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"
    for i in \"${arrayName[@]}\"; do\n  echo $i\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"

    {: .-three-column}

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"
    declare -A sounds\n
    sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n

    Declares sound as a Dictionary object (aka associative array).

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-dictionaries","title":"Working with dictionaries","text":"
    echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]}   # All values\necho ${!sounds[@]}  # All keys\necho ${#sounds[@]}  # Number of elements\nunset sounds[dog]   # Delete dog\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"
    for val in \"${sounds[@]}\"; do\n  echo $val\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"
    for key in \"${!sounds[@]}\"; do\n  echo $key\ndone\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"
    set -o noclobber  # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit    # Used to exit upon error, avoiding cascading errors\nset -o pipefail   # Unveils hidden failures\nset -o nounset    # Exposes unset variables\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"
    shopt -s nullglob    # Non-matching globs are removed  ('*.foo' => '')\nshopt -s failglob    # Non-matching globs throw errors\nshopt -s nocaseglob  # Case insensitive globs\nshopt -s dotglob     # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar    # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n

    Set GLOBIGNORE as a colon-separated list of patterns to be removed from glob matches.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#history","title":"History","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#commands","title":"Commands","text":"

    | history | Show history | | shopt -s histverify | Don't execute expanded result immediately |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#expansions","title":"Expansions","text":"

    | !$ | Expand last parameter of most recent command | | !* | Expand all parameters of most recent command | | !-n | Expand nth most recent command | | !n | Expand nth command in history | | !<command> | Expand most recent invocation of command <command> |

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#operations_1","title":"Operations","text":"

    | !! | Execute last command again | | !!:s/<FROM>/<TO>/ | Replace first occurrence of <FROM> to <TO> in most recent command | | !!:gs/<FROM>/<TO>/ | Replace all occurrences of <FROM> to <TO> in most recent command | | !$:t | Expand only basename from last parameter of most recent command | | !$:h | Expand only directory from last parameter of most recent command |

    !! and !$ can be replaced with any valid expansion.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#slices","title":"Slices","text":"

    | !!:n | Expand only nth token from most recent command (command is 0; first argument is 1) | | !^ | Expand first argument from most recent command | | !$ | Expand last token from most recent command | | !!:n-m | Expand range of tokens from most recent command | | !!:n-$ | Expand nth token to last from most recent command |

    !! can be replaced with any valid expansion i.e. !cat, !-2, !42, etc.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#miscellaneous","title":"Miscellaneous","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#numeric-calculations","title":"Numeric calculations","text":"
    $((a + 200))      # Add 200 to $a\n
    $((RANDOM%=200))  # Random number 0..200\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"
    (cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"
    python hello.py > output.txt   # stdout to (file)\npython hello.py >> output.txt  # stdout to (file), append\npython hello.py 2> error.log   # stderr to (file)\npython hello.py 2>&1           # stderr to stdout\npython hello.py 2>/dev/null    # stderr to (null)\npython hello.py &>/dev/null    # stdout and stderr to (null)\n
    python hello.py < foo.txt      # feed foo.txt to stdin for python\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"
    command -V cd\n#=> \"cd is a function/alias/whatever\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"
    trap 'echo Error at about $LINENO' ERR\n

    or

    traperr() {\n  echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"
    case \"$1\" in\n  start | up)\n    vagrant up\n    ;;\n\n  *)\n    echo \"Usage: $0 {start|stop|ssh}\"\n    ;;\nesac\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"
    source \"${0%/*}/../share/foo.sh\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"
    printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"
    DIR=\"${0%/*}\"\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"
    while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n  -V | --version )\n    echo $version\n    exit\n    ;;\n  -s | --string )\n    shift; string=$1\n    ;;\n  -f | --flag )\n    flag=1\n    ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"
    cat <<END\nhello world\nEND\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"
    echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
    read -n 1 ans    # Just one character\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"

    | $? | Exit status of last task | | $! | PID of last background task | | $$ | PID of shell | | $0 | Filename of the shell script |

    See Special parameters.

    ","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"
    pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"
    if ping -c 1 google.com; then\n  echo \"It appears you have a working internet connection\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"
    if grep -q 'foo' ~/.bash_history; then\n  echo \"You appear to have typed 'foo' in the past\"\nfi\n
    ","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"

    {: .-one-column}

    • Bash-hackers wiki (bash-hackers.org)
    • Shell vars (bash-hackers.org)
    • Learn bash in y minutes (learnxinyminutes.com)
    • Bash Guide (mywiki.wooledge.org)
    • ShellCheck (shellcheck.net)
    ","tags":["Featured"]},{"location":"cheatsheets/docker/","title":"Docker scripting cheatsheets","text":""},{"location":"cheatsheets/docker/#common-docker-commands","title":"Common Docker commands","text":""},{"location":"cheatsheets/docker/#update-all-images","title":"update all images","text":"
    docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
    "},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"
    docker rm `docker ps -a -q -f \"status=exited\"`\n
    "},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"
    docker rmi `docker images -q --filter \"dangling=true\"`\n
    "},{"location":"cheatsheets/macos/","title":"Macos","text":"

    Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.

    At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.

    To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac

    To get a shell to the LinuxKit docker-desktop, run the docker command

    docker run -it --rm --privileged --pid=host justincormack/nsenter1\n

    more info: https://github.com/justincormack/nsenter1

    "},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":"
    • restrict access to applications using authentication label
    "},{"location":"common/acl/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • An access to the ubuntu repository
    • Nodejs installed on your host.
    "},{"location":"common/acl/#update-applistjson-file","title":"Update applist.json file","text":"

    To restrict access to applications using authentication label, you need to define an acl entry in the application dictionary object.

        \"acl\": { \"permit\": [ \"tag\" ] },\n

    For example using the application xedit

    all is a special label for everything. The xedit application can be run for all tags.

    {\n    \"acl\": { \"permit\": [ \"all\" ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.

    "},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"

    You can read the chapter authentification-rules to define some autenticated labels.

    Update the od.config file, to add a label mylocal if the source ip address is in local network 192.168.0.0/16

    authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n   'providers': {\n     'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous',\n        'policies': { \n          'acl'   : { 'permit': [ 'all' ] }, \n            'rules' : \n                { 'rule-net-home': {  \n                    'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n                    'expected'   : True,\n                    'label'      : 'localnet'\n                   } \n                } \n        } \n     } \n    } \n  } \n} \n\n

    Restart the pyos service

    kubectl delete pod -l run-pyos-od -n abcdesktop\n

    When your services are restarted, launch your web browser

    Login to your abcdesktop service and choose anonymous authentication

    Check the label set during the authentication process

    Goto the menu option at the right up corner, choose Settings | User | Session

    You should read the label localnet in the Anonymous user information.

    "},{"location":"common/acl/#define-the-acl-label-to-the-application","title":"Define the acl label to the application","text":"

    You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.

    "},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"

    Create a edit.json file with the content :

    {\n    \"acl\": { \"permit\": [ \"localhost\", \"localnet\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.

    Make sure that you have installed nodejs

    To install make.js command

    wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

    Create icons directory

    mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n

    Run the make command

    node make.js -f xedit.json Dockerfile\n

    You should read on standard output

    myArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'all' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n

    Look at the new Dockerfile, and build the new docker image for xedit

    docker build -t xedit.d .\n

    You should read on standard output

    [+] Building 13.0s (11/11) FINISHED                                                                                                                                                                     \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 2.01kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB                                                                                                     0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB                                                                                                     0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                               8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                       0.4s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                               0.3s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                               0.3s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                    0.0s \n => exporting to image                                                                                                                                                                             0.3s \n => => exporting layers                                                                                                                                                                            0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d  \n

    Then look at the acl label

    docker inspect xedit.d | grep oc.acl\n
                    \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n

    The acl is stringified json object.

    "},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"

    The xedit application is listed only if your are connected from a local network matching the previous rules.

    Look for the application xedit, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :

    Launch the xedit application

    "},{"location":"common/acl/#run-the-application-from-another-source-ip-address-or-update-the-acl-application","title":"Run the application from another source IP address or update the acl application","text":""},{"location":"common/acl/#update-acl-of-xedit-application","title":"Update acl of xedit application","text":"

    To update the acl of xedit application, edit the edit.json file with the content, and set nowhere tag in acl array :

    {\n    \"acl\": { \"permit\": [ \"nowhere\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

    Then, rebuild Dockerfile and the docker image of the xedit application

    node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
    % node make.js -f xedit.json Dockerfile\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'nowhere' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED                                                                                                                                                                      \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 4.19kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                        0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                0.0s\n => CACHED [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [6/6] WORKDIR /home/balloon                                                                                                                                                             0.0s\n => exporting to image                                                                                                                                                                             0.0s\n => => exporting layers                                                                                                                                                                            0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d       \n

    Launch your web browser, and log in to your abcdesktop service

    Check that xedit is not found and not listed.

    The new acl does not allow the xedit application to be run and show. You can now define your own rules, add set the access control list to your applications.

    "},{"location":"common/custom-wallpaper/","title":"Customize default wallpaper","text":""},{"location":"common/custom-wallpaper/#requirements","title":"Requirements","text":""},{"location":"common/custom-wallpaper/#goals","title":"Goals","text":"
    • Change the default wallpaper and use your own
    "},{"location":"common/custom-wallpaper/#change-odconfig-file","title":"Change od.config file","text":"

    To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

    • Add the new entry SET_DEFAULT_WALLPAPER to the value like welcometoabcdesktop.png. The file welcometoabcdesktop.png already exists in the /composer/wallpapers directory of your abcdesktopio/oc.user.XX.YY container image.
    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n                    } \n
    • Restart your pyos daemon, to make sure that the ENV dictionary will be use to start a new user container.
    • Login on your abcdesktop service, your should see the wallpaper file:

    "},{"location":"common/custom-wallpaper/#update-ocuser-image-to-add-your-own-wallpaper","title":"Update oc.user image to add your own wallpaper","text":""},{"location":"common/custom-wallpaper/#find-a-new-wallpaper-image","title":"Find a new wallpaper image","text":"
    • Download a new wallpaper image, for example I choose the file on unsplash.com web site wallpaper unsplash from Silas Baisch
    • Rename the downloaded file as silas-baisch-unsplash.jpg
    "},{"location":"common/custom-wallpaper/#create-a-new-ocuser-image","title":"Create a new oc.user image","text":"
    • Create a Dockerfile to copy the new wallpaper file in /composer/wallpapers directory

    Not For a development environment, add the TAG dev

    FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n
    • Build the new docker image

    To build the new docker image, run the command line

    docker build -t abcdesktopio/oc.user.18.04 .\n

    You should read on the standard output :

    Sending build context to Docker daemon  3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
    "},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"

    To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

    • Add the new entry SET_DEFAULT_WALLPAPER to the value like silas-baisch-unsplash.jpg. The file silas-baisch-unsplash.jpg exists in the /composer/wallpapers directory of your new abcdesktopio/oc.user.18.04 container image.
    desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n                    } \n
    • Restart your pyos daemon, to make sure that the ENV dictionary will be use to start a new user container.
    • Login on your abcdesktop service, your should see the wallpaper :

    "},{"location":"common/debug_application/","title":"How to debug containerised application","text":""},{"location":"common/debug_application/#requirements","title":"Requirements","text":"
    • abcdesktop ready to run
    • docker or ctr package should be install on your Linux (optional)
    "},{"location":"common/debug_application/#goals","title":"Goals","text":"
    • Read log from web interface
    • Read log from daemon interface (optionnal)
    • Read stdout and stderr, dump all environment variables, and entrypoint log, to troubleshoot application error and get quick informations
    "},{"location":"common/debug_application/#read-log-from-web-interface","title":"Read log from web interface","text":"

    Start an containerised application, I choose 2048 application, for example.

    Using the web browser, choose Settings in the menu.

    Choose Tasks to list all running containers

    Choose Logs to read the stdout log file of an application

    This application write on stdout

    Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
    "},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"

    You will read the sample stdout line, using a docker logs command, open a shell on you host.

    In a shell on your host, look for the container id of the 2048 containerised application

    $ docker ps -a|grep 2048\n01579054a1f6   abcdesktopio/ubuntu-2048.d:3.0   \"/composer/appli-doc\u2026\"   21 minutes ago     Up 21 minutes                                                                   anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n

    Read the log file form the docker logs command

    $ docker logs 01579054a1f6\n

    You should read on output the same lines written on the web interface

    Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
    "},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr and stdout","text":"

    The main log files are lastcmd.log lastcmdenv.log and $APPBIN.log:

    • /tmp/lastcmd.log : contains the stdout file of the init script command /composer/appli-docker-entrypoint.sh for latest running application
    • /tmp/lastcmdenv.log: contains the dump of all environment variables for latest running application
    • /tmp/$APPBIN.log: contains stderr and stdout of the application $APPBIN. $APPBIN should be replace by the name of your binary application filename.

    By default, with all abcdesktop templates, applications redirect stderr to stdout and pipe to a tee.

    ${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n

    By default, the /tmp volume is shared with all containers. So to debug and read log applications, you can run a webshell to have an access to stdout and stderr content.

    The var $BASENAME_APP is the name of your application

    BASENAME_APP=$(basename \"$APPBIN\")\n

    and APPBIN is path to the binary

    Example with the 2048-qt application

    APPBIN=/usr/games/2048-qt\n

    The /tmp directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp directory

    balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root    root     260 Dec  1 09:58 .\ndrwxr-xr-x 1 root    root    4096 Dec  1 09:55 ..\n-rw-r--r-- 1 balloon balloon  102 Dec  1 09:58 2048-qt.log\nsrwxrwxrwx 1 root    root       0 Dec  1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon    0 Dec  1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec  1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon  437 Dec  1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon   60 Dec  1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon    0 Dec  1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon   40 Dec  1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon   11 Dec  1 09:55 .X0-lock\ndrwxrwxrwt 2 root    root      60 Dec  1 09:55 .X11-unix\nsrw------- 1 balloon balloon    0 Dec  1 09:55 .x11vnc\nballoon:~$\n

    The files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/2048-qt.log.

    • /tmp/lastcmd.log the init command log file created by /composer/appli-docker-entrypoint.sh
    • /tmp/lastcmdenv.log the last environment variables file
    • /tmp/2048-qt.log the command log file for the application

    Dump the /tmp/2048-qt.log, with a cat command cat /tmp/2048-qt.log. Replace /tmp/2048-qt.log by your own application (binary) if you choose another application.

    You can run all bash commands inside the webshell.

    balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n

    Dump the /composer/appli-docker-entrypoint.sh result in /tmp/lastcmd.log, with a cat command cat /tmp/lastcmd.log.

    balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n

    Dump all environment variables in file /tmp/lastcmdenv.log.

    balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n

    We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.

    In next chapter we will start an application from a fresh ubuntu image, to get more details.

    "},{"location":"common/disable-firefox-connections/","title":"How to disable Mozilla Firefox automatic connections at startup","text":""},{"location":"common/disable-firefox-connections/#usage-of-policiesjson","title":"Usage of policies.json","text":"

    You can specifiy firefox policies in a file called policies.json, you may have to create it as it is noy present by default.

    Path to policies.json depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\distribution\\policies.json Linux : /usr/lib/firefox/distribution/policies.json MacOS : /Applications/Firefox.app/Contents/Resources/distribution/policies.json

    You can find all the policies templates, according to your firefox version, on the mozilla github page : https://github.com/mozilla/policy-templates/releases

    "},{"location":"common/disable-firefox-connections/#usage-of-autoconfigjs-and-firefoxcfg","title":"Usage of autoconfig.js and firefox.cfg","text":"

    Some preferences cannot be set through the policies.json file, such as disable normandy, because of firefox restrictions. But we can bypass it by creating a JS file called autoconfig.js and a config file called firefox.cfg.

    autoconfig.js is used to load and execute firefox.cfg.

    "},{"location":"common/disable-firefox-connections/#autoconfigjs","title":"autoconfig.js","text":"
    // Setup config file\npref(\"general.config.filename\", \"firefox.cfg\");\npref(\"general.config.obscure_value\", 0);\n

    Path to autoconfig.js depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\defaults\\pref\\autoconfig.js Linux : /usr/lib/firefox/defaults/pref/autoconfig.js MacOS : /Applications/Firefox.app/Contents/Resources/defaults/pref/autoconfig.js

    The locked preferences are specified in the firefox.cfg file. Path to firefox.cfg depending on your OS (you may have to create directories of the paths):

    Windows : C:\\Program Files\\Mozilla Firefox\\firefox.cfg Linux : /usr/lib/firefox/firefox.cfg MacOS : /Applications/Firefox.app/Contents/Resources/firefox.cfg

    "},{"location":"common/disable-firefox-connections/#usage-of-proxypac-file","title":"Usage of proxy.pac file","text":"

    Despite all the efforts to disable automatic connections via policies.json and firefox.cfg files, there where still a few connections that seems to be not possible to disable. To bypass this phenomena, we will create a file named proxy.pac that will block access to the remaining URLs by redirecting them to an unreachable proxy.

    Save proxy.pac on your machine and keep in mind the path to your file.

    Once done, you should add the following line to the Proxy policy inside your policies.json file : \"AutoConfigURL\": \"file:///path/to/your/proxy.pac\"

    "},{"location":"common/disable-firefox-connections/#disable-startup-connections","title":"Disable startup connections","text":""},{"location":"common/disable-firefox-connections/#policiesjson","title":"policies.json","text":"URL Parameter(s) to set https://location.services.mozilla.com \"browser.region.network.url\": \"\" https://contile.services.mozilla.comhttps://tiles-cdn.prod.ads.prod.webservices.mozgcp.net \"browser.topsites.contile.enabled\": false\"browser.topsites.contile.endpoint\": \"\" https://spocs.getpocket.com \"browser.newtabpage.activity-stream.discoverystream.enabled\": false https://push.services.mozilla.com \"dom.push.connection.enabled\": false https://accounts.firefox.com \"browser.startup.homepage_override.mstone\": \"ignore\"(also disable news page) https://shavar.services.mozilla.com \"browser.safebrowsing.provider.mozilla.gethashURL\": \"\"\"browser.safebrowsing.provider.mozilla.updateURL\": \"\" https://tracking-protection.cdn.mozilla.net \"browser.safebrowsing.downloads.remote.enabled\": false http://detectportal.firefox.com \"network.captive-portal-service.enabled\": false\"network.connectivity-service.enabled\": false https://incoming.telemetry.mozilla.orghttps://www.mozilla.org Set \"DisableTelemetry\" policy to true"},{"location":"common/disable-firefox-connections/#firefoxcfg","title":"firefox.cfg","text":"URL Parameter(s) to set https://normandy.cdn.mozilla.nethttps://classify-client.services.mozilla.com lockPref(\"app.normandy.enabled\", false)lockPref(\"app.normandy.api_url\", \"\")"},{"location":"common/disable-firefox-connections/#example-of-policiesjson-file","title":"Example of policies.json file","text":"
    \"policies\": {\n    \"DisableTelemetry\": true,\n    \"Preferences\": {\n        \"browser.region.network.url\": \"\",\n        \"browser.topsites.contile.endpoint\": \"\",\n        \"browser.newtabpage.activity-stream.discoverystream.enabled\": false,\n        \"browser.startup.homepage_override.mstone\": \"ignore\",\n        \"browser.safebrowsing.provider.mozilla.gethashURL\": \"\",\n        \"browser.safebrowsing.provider.mozilla.updateURL\": \"\",\n        \"browser.safebrowsing.downloads.remote.enabled\": false,\n        \"dom.push.connection.enabled\": false,\n        \"network.captive-portal-service.enabled\": false,\n        \"network.connectivity-service.enabled\": false\n    },\n    \"Proxy\": {\n        \"Mode\": \"autoConfig\",\n        \"AutoConfigURL\": \"file:///path/to/your/proxy.pac\"\n    }\n}\n
    "},{"location":"common/disable-firefox-connections/#example-of-firefoxcfg-file","title":"Example of firefox.cfg file","text":"
    // Disable Normandy service\nlockPref(\"app.normandy.enabled\", false);\nlockPref(\"app.normandy.api_url\", \"\");\n
    "},{"location":"common/disable-firefox-connections/#example-of-proxypac-file","title":"Example of proxy.pac file","text":"
    // File PAC\n//\nfunction FindProxyForURL(url, host)\n{\n  // just define hostname and unreachable port\n  var var_blackhole = \"127.0.0.1:12345\"; // could be any other UNUSED port than 12345\n\n  //URL deny definition - Blackhole for blocked URL\n\n  if ( host == \"firefox.settings.services.mozilla.com\"\n    || host == \"content-signature-2.cdn.mozilla.net\"\n    || host == \"firefox-settings-attachments.cdn.mozilla.net\"\n  ) {\n    return \"PROXY \" + var_blackhole;\n  }\n\n  return  \"DIRECT; \";\n}\n
    "},{"location":"common/disable-firefox-connections/#sources","title":"Sources","text":"
    • How to stop Firefox from making automatic connections
    • nikitastupin/stop-firefox-automatic-connections
    • Silencing Firefox's Chattiness for Web App Testing
    • Customizing Firefox Using AutoConfig
    • Firefox Reddit
    • Mozilla support forums
    "},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"
    1. Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation button.

    2. Choose Add as a response to the question Add abcdesktop Clipboad Helper ?

    3. Press OKay, Got it to confirm the abcdesktop Clipboad helper insallation

    "},{"location":"common/firefox-extension/#use-fully-qualified-domain-name-filter","title":"Use fully qualified domain name filter","text":"

    Firefox clipboard extension runs ONLY if the hostname contains desktop string.

    The URL must matches *://*desktop*/*\" to run the clipboard extension.

    • https://demo.abcdesktop.io matches, the firefox clipboard extension is running.
    • https://desktop.domain.io matches, the firefox clipboard extension is running.
    • https://abcdesktop.mydomain.local matches, the firefox clipboard extension is running.
    • https://demo.domain.com does not match, the firefox clipboard extension is not running.
    "},{"location":"common/firefox-extension/#run-firefox-clipboard-extension-for-abcdesktop","title":"Run firefox clipboard extension for abcdesktop","text":"

    Firefox clipboard extension syncs only text data, binary data like images are not yet supported.

    • Firefox clipboard extension syncs your clipboard data selected from your abcdesktop desktop to your local desktop environment.

    • Firefox clipboard extension syncs your local desktop environment clipboard to your abcdesktop desktop clipboard.

    "},{"location":"common/flash-firefox-esr/","title":"How to build and run abcdesktop firefox-esr image to run flash application","text":"

    Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.

    Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.

    Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.

    Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.

    "},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":"
    • use Flash Player for own web site
    "},{"location":"common/flash-firefox-esr/#requirements","title":"Requirements","text":"
    • A running dockerd last version
    • An access to the docker public registry
    • Nodejs installed on your host.
    "},{"location":"common/flash-firefox-esr/#edit-the-mmscfg-file","title":"Edit the mms.cfg file","text":"

    Edit the mms.cfg file, and add your own website url

    EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n

    Add the a new line and replace https://www.domain.comby your own web site

    AllowListURLPattern=https://www.domain.com\n
    "},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"

    Create a Dockerfile firefox-esr.d

    • to copy your new mms.cfg into the directory /etc/adobe of your container image
    FROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
    "},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"

    Run the docker build command

    docker build -t firefox-esr.d -f firefox-esr.d .\n
    "},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

    Using you web browser, log in to your abcdesktop service

    Look at the twice firefox icon for Firefox and Firefox-esr application.

    Start the application Firefox-esr

    Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site

    Click to the Run Adobe Flash plugins

    And Allow the Adobe Flash to run

    Great, you can run the Adobe Flash plugins.

    "},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and build Citrix Receiver for abcdesktop","text":"

    Citrix Workspace App or Citrix Receiver does not exist in official debian repository. You need to download the deb package from the www.citrix.com website manually.

    • Clone the abcdesktopio/oc.apps repository
    git clone https://github.com/abcdesktopio/oc.apps.git\n
    • Download the Citrix Receiver for Linux .deb package. Go to https://www.citrix.com/downloads/citrix-receiver/linux/receiver-for-linux-latest.html

    • Copy the downloaded file icaclient_13.10.0.20_amd64.deb for example as icaclient_amd64.deb to your local oc.apps directory

    cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
    • Run docker build command
    docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
    Sending build context to Docker daemon  29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
    • The new ica citrix docker image abcdesktopio/citrix.d:dev is ready to run
    "},{"location":"common/shm/","title":"IPC and pod","text":"

    Does a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?

    Let's have a look !

    There are two ways to use shared memory in Linux: System V and POSIX.

    • shmget / shmat / shmdt for the System V method.
    • shm_open / mmap / shm_unlink for the POSIX method.
    "},{"location":"common/shm/#requirements","title":"Requirements","text":"
    • kubectl command-line tool must be configured to communicate with your cluster.
    "},{"location":"common/shm/#install-the-bash-and-yaml-files","title":"Install the bash and yaml files","text":"

    To install the bash and yaml files, run the command

    git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
    "},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"

    Goal: Test System V shared memory between two containers inside the same pod

    This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.

    The test is successful if there is no system error and the strings are equals.

    The string MemContents stored in the shared memory is : This is the way the world ends...

    • The sender container writes a string from stdin into shared memory. The source code is here
        int exit_code = -1;\n    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    strcpy( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n
    • The receiver container print the sender's shared memory string to stdout. The source code is here
        // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    printf(\"%s\\n\",str);\n    cmp_code = strcmp( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n

    To run the System V tests

    "},{"location":"common/shm/#run-a-shared-memory-test-access-using-a-shared-path","title":"Run a shared memory test access using a shared path","text":"

    In this yaml file, sender and receiver containers share a file. This file is /shared/me and it is the first parameter to ftok system V call.

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n    - name: receiver\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n

    The env var FTOK_PATH set the first parameter to ftok system V call.

    Run the test

    # this test result is success\n./runtest.sh podsendershared_success.yaml\n

    You can read the same string from sender to receive container.

    This test is OK.

    pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
    "},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"

    In this yaml file, sender and receiver do not share file. /dummy filename is the first parameter to ftok system V call.

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n    - name: receiver\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n

    The env var FTOK_PATH set the first parameter to ftok system V call.

    Run the test

    # this test result is failed\n./runtest.sh podsendershared_failed.yaml\n

    You can read that the sender write a string. The receiver does not read this string.

    This test is KO.

    pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n

    The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers

    "},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"

    Goal: Test Posix shared memory between two containers inside the same pod

    The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin

    This test creates two containers a sender and a receiver to read a shared memory in /dev/shm, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.

    The string MemContents stored in the shared memory is : This is the way the world ends...

    • The sender container writes a string into shared memory map file /shMemEx
      int fd = shm_open(BackingFile,      /* name from smem.h */\n                    O_RDWR | O_CREAT, /* read/write, create if needed */\n                    AccessPerms);     /* access permissions (0644) */\n  if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n  ftruncate(fd, ByteSize); /* get the bytes */\n\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1  == memptr) report_and_exit(\"Can't get segment...\");\n\n  fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n  fprintf(stderr, \"backing file:       /dev/shm%s\\n\", BackingFile );\n\n  /* semahore code to lock the shared mem */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n  /* increment the semaphore so that memreader can read */\n  if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n  sleep(12); /* give reader a chance */\n\n  /* clean up */\n  munmap(memptr, ByteSize); /* unmap the storage */\n  close(fd);\n  sem_close(semptr);\n  shm_unlink(BackingFile); /* unlink from the backing file */\n\n
    • The receiver container print the sender's shared memory string to stdout
      int fd = shm_open(BackingFile, O_RDWR, AccessPerms);  /* empty to begin */\n  if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n  /* get a pointer to memory */\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n  /* create a semaphore for mutual exclusion */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n  if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n    int i;\n    for (i = 0; i < strlen(MemContents); i++)\n      write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n    sem_post(semptr);\n  }\n\n  /* cleanup */\n  munmap(memptr, ByteSize);\n  close(fd);\n  sem_close(semptr);\n  unlink(BackingFile);\n

    To run the POSIX test

    kubectl create -f podposixshm.yaml \npod/podposixshm created\n

    The podposixshm pod status must be Completed

    kubectl get pods podposixshm  \nNAME          READY   STATUS      RESTARTS   AGE\npodposixshm   0/2     Completed   0          27s\n

    The podposixshm sender log file should be :

    kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file:       /dev/shm/shMemEx\n

    The pod/podposixshm receiver log file should be :

    kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n

    Delete the podposixshm pod

    kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
    "},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"

    On a pod, we can see that the default size of /dev/shm is 64MB, when running the df /dev/shm command.

    kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
    df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

    A dd command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.

    Run the dd command

    dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n

    Run the df /dev/shm command

    df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

    Delete the shmtest pod

    kubectl delete pods shmtest\npod \"shmtest\" deleted\n

    The default size is 64 MB.

    "},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"

    Create a updateshm.yaml file with the yaml content

    apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm\n  name: updateshm\nspec:\n  volumes:                          \n    - name: volumeshm\n      emptyDir:\n        medium: Memory\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: volumeshm\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n

    Create the new pod updateshm

    kubectl apply -f updateshm.yaml \npod/updateshm created\n

    Execute a df /dev/shm command inside this pods to read the size of /dev/shm

    kubectl exec updateshm -- df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\ntmpfs                 16176264         0  16176264   0% /dev/shm\n

    The size of /dev/shm is 16176264 of 1K blocks. The new default size is 16 GB.

    To set a fixed limit use the sizeLimit in the spec.volumes

    apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm512\n  name: updateshm512\nspec:\n  volumes:                          \n    - name: updateshm512\n      emptyDir:\n        medium: Memory\n        sizeLimit: 512Mi\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: updateshm512\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n
    "},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":"
    • Upload file from your local storage to your abcdesktop
    • Download file from your abcdesktop to your local storage
    "},{"location":"common/upload_and_download_files/#upload-file-in-your-desktop","title":"Upload file in your desktop","text":"

    To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop

    Then, start the filemanager, your new file is located in your home directory

    "},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"

    To download file from your abcdesktop to you local storage, just start the file manager.

    Choose your file and using the right mouse button, choose the menu option Download for Desktop as describe :

    The file is downloaded by your web browser

    The file is located in your Downloads directory

    Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.

    "},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"

    The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine

    "},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"

    To get the installation script and the vagrant file, run the command

    git clone https://github.com/abcdesktopio/vagrant.git\n
    • The vagrant file name is Vagrantfile.kubernetes.bastion
    • The installation script is abcdesktop_kubernetes_bastion.sh
    "},{"location":"common/1.0/abcdesktop.bastion/#start-vagrant-file-to-run-the-kmaster-vm","title":"start vagrant file to run the kmaster vm","text":"

    Run the command to run the vagrant file

    $ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n

    This vagrant file defines a vm kmaster :

    kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n  v.name = \"kmaster\"\n  v.memory = 4096\n  v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n

    It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )

    All networks are defined as private_network to make it simplest as possible.

    "},{"location":"common/1.0/abcdesktop.bastion/#abcdesktop_kubernetes_bastionsh-description","title":"abcdesktop_kubernetes_bastion.sh description","text":"

    abcdesktop_kubernetes_bastion.sh takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64 :

    • kubernetes
    • abcdesktop
    • multus-cni
    • multi-networkpolicy

    Read step by step the abcdesktop_kubernetes_bastion.sh content to get more details.

    You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file

    "},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into the kmaster vm","text":"
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n

    List kube-system pods and abcdesktop pods

    To run kubectl commands inside the master virtual machine

    export KUBECONFIG=/etc/kubernetes/admin.conf \n
    vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME                              READY   STATUS    RESTARTS   AGE\ncoredns-64897985d-4d57p           1/1     Running   0          11h\ncoredns-64897985d-qtmkq           1/1     Running   0          11h\netcd-kmaster                      1/1     Running   0          11h\nkube-apiserver-kmaster            1/1     Running   0          11h\nkube-controller-manager-kmaster   1/1     Running   0          11h\nkube-flannel-ds-gskrs             1/1     Running   0          11h\nkube-proxy-c566l                  1/1     Running   0          11h\nkube-scheduler-kmaster            1/1     Running   0          11h\n
    vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-pt2j6           1/1     Running   0          11h\ndaemonset-pyos-zqpf7            1/1     Running   0          11h\nmemcached-od-78578c879-kstcl    1/1     Running   0          11h\nmongodb-od-5c68794bb8-wf6sm     1/1     Running   0          11h\nopenldap-od-558f7959d5-vhbln    1/1     Running   0          11h\nspeedtest-od-7b66cc656b-fh97g   1/1     Running   0          11h\n
    "},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

    Open your web browser to

    http://[your-ip-hostname]:30443/\n

    Replace [your-ip-hostname] by the host node IP address

    You should get the web page

    "},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"

    abcdesktop adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server

    Login Accounts Login Password Hubert J. Farnsworth professor Philip J. Fry fry Hermes Conrad hermes Turanga Leela leela Bender Bending Rodr\u00edguez bende

    Use the credentials, to login

    • Login Account: Philip J. Fry
    • Login Password: fry

    "},{"location":"common/1.0/abcdesktop.bastion/#get-the-default-desktop","title":"Get the default desktop","text":"

    After the login, you should get the default desktop.

    "},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"

    To start a shell, insert webshell as keywords in the search text area :

    "},{"location":"common/1.0/abcdesktop.bastion/#run-ifconfig-command-to-list-network-interfaces","title":"Run ifconfig command to list network interfaces","text":"

    In the web shell, run the command

    $ ifconfig -a\n

    This command shows the network interfaces net1 and net2 with the associated ip address

    "},{"location":"common/1.0/abcdesktop.bastion/#tag-and-rules","title":"Tag and rules","text":"
    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    "},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml","text":"

    Open the abcdesktop.yaml configuration file, and look at ldapconfig

        ldapconfig : { 'planet': {  'default'       : True,\n                                'ldap_timeout'  : 15,\n                                'ldap_protocol' : 'ldap',\n                                'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                                'servers'       : [ 'openldap.abcdesktop.svc.cluster.local' ],\n                                'secure'        : False,\n                                'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n                                'policies': {\n                                    'acls': None,\n                                    'rules' : {\n                                        'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ], 'expected' : True, 'label': 'shipcrew'   },\n                                        'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
    • openldap.abcdesktop.svc.cluster.local is a local ldap server running as a pod
    "},{"location":"common/1.0/abcdesktop.bastion/#rules-description","title":"Rules description","text":"
    • 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'shipcrew' } If a user is member of 'cn=ship_crew,ou=people,dc=planetexpress,dc=com' then the label tag shipcrew is set to the user's pod

    • 'rule-admin': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True } ], 'expected' : True, 'label': 'adminstaff' } If a user is member of 'cn=admin_staff,ou=people,dc=planetexpress,dc=com' then the label tag adminstaff is set to the user's pod

    In the abcdesktop.yaml configuration file, and look at the desktop.policies and the network option

     desktop.policies: {\n        'rules': {\n            'network': {\n                'shipcrew': {\n                    'annotations' : {\n                        'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n                    }\n                }\n            }\n        },\n        'acls' : {} }\n

    If a pod as the 'shipcrew' tag, then add the network annotations

    [ \n    {   \"name\": \"macvlan-conf-eth3\"}, \n    {   \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
    "},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop namespace","text":"

    To list pod in the abcdesktop namespace, run the command

    export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
    root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME                                       READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-5dzjc                      1/1     Running   0          151m\ndaemonset-pyos-szs8h                       1/1     Running   0          151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308   3/3     Running   0          86m\nmemcached-od-78578c879-vx26h               1/1     Running   0          151m\nmongodb-od-6568f85897-tgfjb                1/1     Running   0          151m\nopenldap-od-558f7959d5-qz2kg               1/1     Running   0          151m\nspeedtest-od-76d578578d-rl8k8              1/1     Running   0          151m\n
    "},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"

    Run the command

    kubectl describe pods YOUR_POD\n

    Replace YOUR_POD by your pod

    root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName:         fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace:    abcdesktop\nPriority:     0\nNode:         kmaster/10.0.2.15\nStart Time:   Mon, 31 Jan 2022 16:14:16 +0000\nLabels:       access_provider=planet\n              access_userid=FRY\n              access_username=philip_j__fry\n              broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n              domain=desktop\n              netpol/ocuser=true\n              pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n              shipcrew=true\n              type=x11server\n              xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n

    The label shipcrew=true is set

    Annotations:  k8s.v1.cni.cncf.io/network-status:\n                [{\n                    \"name\": \"cbr0\",\n                    \"interface\": \"eth0\",\n                    \"ips\": [\n                        \"10.244.0.12\"\n                    ],\n                    \"mac\": \"06:17:a7:0c:24:9b\",\n                    \"default\": true,\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth3\",\n                    \"interface\": \"net1\",\n                    \"ips\": [\n                        \"192.168.29.12\"\n                    ],\n                    \"mac\": \"3a:db:a1:33:53:72\",\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth2\",\n                    \"interface\": \"net2\",\n                    \"ips\": [\n                        \"10.9.1.12\"\n                    ],\n                    \"mac\": \"86:eb:43:fe:db:e7\",\n                    \"dns\": {}\n                }]\n

    The Annotations k8s.v1.cni.cncf.io/network-status describes the network interfaces inside the pod.

    "},{"location":"common/1.0/abcdesktop.bastion/#look-at-the-pre-installed-network-rules","title":"Look at the pre installed network rules","text":"

    Run the command

    kubectl get net-attach-def -n abcdesktop\n
    root@kmaster:~#  kubectl get net-attach-def -n abcdesktop\nNAME                AGE\nmacvlan-conf-eth2   154m\nmacvlan-conf-eth3   154m\n

    Get more details about macvlan-conf-eth3

    root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName:         macvlan-conf-eth3\nNamespace:    abcdesktop\nLabels:       <none>\nAnnotations:  <none>\nAPI Version:  k8s.cni.cncf.io/v1\nKind:         NetworkAttachmentDefinition\nMetadata:\n  Creation Timestamp:  2022-01-31T15:10:38Z\n  Generation:          1\n  Managed Fields:\n    API Version:  k8s.cni.cncf.io/v1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:metadata:\n        f:annotations:\n          .:\n          f:kubectl.kubernetes.io/last-applied-configuration:\n      f:spec:\n        .:\n        f:config:\n    Manager:         kubectl-client-side-apply\n    Operation:       Update\n    Time:            2022-01-31T15:10:38Z\n  Resource Version:  1008\n  UID:               a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n  Config:  { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents:    <none>\n

    macvlan-conf-eth3 is used by the user's pod.

    "},{"location":"common/1.0/abcdesktop.bastion/#list-multi-policy","title":"List multi-policy","text":"

    To list multi-policy, run the command

    kubectl get multi-policy -n abcdesktop\n
    root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME                  AGE\nmnp-permit-shipcrew   3h\n

    And get description about the policy mnp-permit-shipcrew

    apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n  name: mnp-permit-shipcrew\n  namespace: abcdesktop \n  annotations:\n    k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n  podSelector:\n    matchLabels:\n      shipcrew: 'true' \n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - ipBlock: \n        cidr: 192.168.55.21/32\n    - ipBlock:\n        cidr: 192.168.55.22/32\n    ports:\n      - protocol: TCP\n        port: 22\n

    If a pod in the abcdesktop namespace, contains a label shipcrew: 'true' set the iptables to permit egress to host 192.168.55.21/32 and 192.168.55.22/32 using protocol TCP destination port 22.

    "},{"location":"common/1.0/abcdesktop.bastion/#dump-the-generated-by-iptables-in-varlibmulti-networkpolicyiptables","title":"dump the generated by iptables in /var/lib/multi-networkpolicy/iptables/","text":"
    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    • list the directories /var/lib/multi-networkpolicy/iptables/ in kmaster
    root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n

    A new afe82680-77b4-4bac-ad2b-8be9488402fb exists

    • cat the current.iptables file content in the /var/lib/multi-networkpolicy/iptables/ afe82680-77b4-4bac-ad2b-8be9488402fb
    root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
    "},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"

    For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.

    • Login into your kmaster
    VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
    • Become root into your kmaster
    vagrant@kmaster:~$ sudo bash\n
    • list your docker images
    root@kmaster:~# docker images\nREPOSITORY                                                  TAG       IMAGE ID       CREATED         SIZE\nabcdesktopio/oc.pyos                                        dev       6bd8b8d33b73   19 hours ago    1.17GB\nrancher/mirrored-flannelcni-flannel                         v0.16.3   8cb5de74f107   3 days ago      59.7MB\nmemcached                                                   latest    fa6cf68061c2   5 days ago      89.1MB\nk8s.gcr.io/kube-apiserver                                   v1.23.3   f40be0088a83   6 days ago      135MB\nk8s.gcr.io/kube-controller-manager                          v1.23.3   b07520cd7ab7   6 days ago      125MB\nk8s.gcr.io/kube-scheduler                                   v1.23.3   99a3486be4f2   6 days ago      53.5MB\nk8s.gcr.io/kube-proxy                                       v1.23.3   9b7cc9982109   6 days ago      112MB\nabcdesktopio/oc.user.18.04                                  latest    52176672cf2e   7 days ago      1.79GB\nabcdesktopio/oc.user.ssh.18.04                              dev       52176672cf2e   7 days ago      1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables   latest    54838d8bbd14   10 days ago     408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin              v1.0.1    ac40ce625740   12 days ago     8.1MB\nabcdesktopio/oc.nginx                                       dev       fe71c8621ef2   12 days ago     506MB\nabcdesktopio/oc.pulseaudio.18.04                            dev       d44997a46969   2 months ago    170MB\nabcdesktopio/oc.pulseaudio.18.04                            latest    d44997a46969   2 months ago    170MB\nk8s.gcr.io/etcd                                             3.5.1-0   25f8c7f3da61   3 months ago    293MB\nghcr.io/k8snetworkplumbingwg/multus-cni                     stable    e6cafb5d5aa1   3 months ago    290MB\nk8s.gcr.io/coredns/coredns                                  v1.8.6    a4ca41631cc7   3 months ago    46.8MB\nabcdesktopio/oc.cupsd.18.04                                 dev       095105a59722   4 months ago    745MB\nabcdesktopio/oc.cupsd.18.04                                 latest    095105a59722   4 months ago    745MB\nk8s.gcr.io/pause                                            3.6       6270bb605e12   5 months ago    683kB\nrroemhild/test-openldap                                     latest    c6b1bec361ca   10 months ago   144MB\nabcdesktopio/oc.mongo                                       latest    802219537d3b   12 months ago   493MB\nabcdesktopio/oc.speedtest                                   dev       298a391cfb5b   3 years ago     355MB\n
    • Add new application images

    To add an application like Firefox, run the docker pull command :

    root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
    docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
    "},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"

    Reload or open your web browser

    http://[your-ip-hostname]:30443/\n

    Firefox is added to your desktop dock. Start Firefox application

    No rule has be defined to allow http request from your pod to a web site

    All http requests are denied

    The firefox application inherits from the pod's the network rules.

    "},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"

    If you choose to use VMware instead of VirtualBox hypervisor

    "},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about the macvlan driver :","text":"

    Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.

    "},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan driver on vSwitch VMware","text":"

    The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.

    When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.

    Set the Mac address changes option is set to Accept

    "},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":"
    • Use a dedicated network for an application. For example bind the application Firefox to a dedicated docker network. This dedicated network can use macvlan, ipvlan or an SRIOV network driver.
    "},{"location":"common/1.0/docker_macvlan/#architecture","title":"Architecture","text":"

    When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.

    "},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"

    On your worker nodes :

    • create a dedicated network interface to bridge the new network interface
    • add the label abcdesktop=true to the network object

    You have to choose a nework driver for example

    network driver macvlan ipvlan docker-sriov-plugin

    Only the name of the network is used by abcdesktop.

    Create a network with macvlan or ipvlan driver

    In these two examples :

    • Subnet is 192.168.8.0/24
    • Gateway is 192.168.8.254
    • Ip Range is 192.168.8.0/27
    "},{"location":"common/1.0/docker_macvlan/#example-with-macvlan","title":"Example with macvlan :","text":"

    Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123

    docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
    "},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan ipvlan_mode=l2 :","text":"

    Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.

    docker network create --label type=oc.app -d ipvlan  -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
    "},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan or ipvlan):","text":"

    Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :

    • ping the default gateway
    • nslookup to query www.google.com ip address
    export GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
    "},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"

    Update your applist.json file and add a specific rule into the firefox application description

    git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

    Specific rules entry example

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

    In this example, if the current user token contains the tag label internet when the firefox application use abcnetfirefox and the dns 8.8.8.8

    "},{"location":"common/1.0/docker_macvlan/#edit-the-applistjson-file","title":"Edit the applist.json file","text":"

    Edit the applist.json file, and add rules to the application firefox for example

    The new firefox dictionary with rules :

    {\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

    Save your changes, and run make dockerfile, next docker build

    Build and update your new firefox application

    # create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

    Check that the oc.rules label in new firefox.d image

    docker inspect firefox.d \n

    The oc.rules label is a string json formated

    \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
    "},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"

    Add a tag internet to the user auth provider

    "},{"location":"common/1.0/docker_macvlan/#update-authprovider-in-odconfig-file","title":"Update authprovider in od.config file","text":"

    Update the ldapconfig for planet with the new policies dict

      'policies': { 'acls': None, \n              'rules'   : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ],\n              'expected' : True, \n              'label': 'internet' },\n

    The complete ldapconfig for planet is

    ldapconfig : { 'planet': {    'default'       : True,\n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.7.69' ],\n                        'secure'        : False,\n                        'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n                        'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}',  \n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n                        'policies': { 'acls': None, \n             'rules'    : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'internet' } \n      } } } }\n

    Restart your kubernetes pyos pod, to reload new the od.config configuration file.

    "},{"location":"common/1.0/docker_macvlan/#use-the-philip-j-fry-user-context","title":"Use the Philip J. Fry user context.","text":"

    Open a web browser, go to the abcdesktop login page.

    Login Accounts

    Login Password Philip J. Fry. fry Hubert J. Farnsworth professor

    Note: the user Philip J. Fry is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Login as the Philip J. Fry user account.

    During the user login process, pyos tag the user authentification with the 'label': 'internet'

    Start the new application firefox, the docker network for this application use the abcnetfirefox

    Run the command

    docker network inspect abcnetfirefox\n

    abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\" and bind the abcnetfirefox to user container.

    [\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {\n            \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n                \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n                \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n                \"MacAddress\": \"02:42:a1:69:d0:82\",\n                \"IPv4Address\": \"192.168.8.1/24\",\n                \"IPv6Address\": \"\"\n            }\n        },\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

    Close the firefox application.

    Logoff, to remove the user pod Philip J. Fry.

    "},{"location":"common/1.0/docker_macvlan/#use-the-hubert-j-farnsworth-user-context","title":"Use the `Hubert J. Farnsworth user context.","text":"

    Login as the Hubert J. Farnsworth user account.

    Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    Start the new application firefox, the docker network for this application do NOT use the abcnetfirefox

    Run the command

    docker network inspect abcnetfirefox\n

    abcnetfirefox description :

    docker network inspect abcnetfirefox\n[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

    The new firefox container doesn't use the docker network abcnetfirefox, because the Hubert J. Farnsworth user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

    The network is disabled by default.

    Inspect the Hubert J. Farnsworth firefox container

            \"NetworkSettings\": {\n            \"Bridge\": \"\",\n            \"SandboxID\": \"\",\n            \"HairpinMode\": false,\n            \"LinkLocalIPv6Address\": \"\",\n            \"LinkLocalIPv6PrefixLen\": 0,\n            \"Ports\": {},\n            \"SandboxKey\": \"\",\n            \"SecondaryIPAddresses\": null,\n            \"SecondaryIPv6Addresses\": null,\n            \"EndpointID\": \"\",\n            \"Gateway\": \"\",\n            \"GlobalIPv6Address\": \"\",\n            \"GlobalIPv6PrefixLen\": 0,\n            \"IPAddress\": \"\",\n            \"IPPrefixLen\": 0,\n            \"IPv6Gateway\": \"\",\n            \"MacAddress\": \"\",\n            \"Networks\": {}\n        }\n

    The network access is disable for this application

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n

    In this case, only users with the label tag internet, can bind the network name abcnetfirefox.

    "},{"location":"common/1.0/docker_macvlan/#enable-network-for-hubert-j-farnsworth","title":"Enable network for Hubert J. Farnsworth","text":"

    Update the application firefox rules

    Now it's time to permit network access to

    Update the applist.json file :

    Specific rules entry example

    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

    The new firefox dictionary with network rules set with \"default\": true :

    {\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

    Save your changes, and run make dockerfile, next docker build

    Build and update your new firefox application

    # create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

    Check that the oc.rules label in new firefox.d image

    docker inspect firefox.d \n

    The oc.rules label is a string json formated

     \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n

    Request the abcdesktop core service to update the application cache data

    Replace MY_FQDN by your own hostname

    export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n

    You do not need to logoff the Hubert J. Farnsworth, just close Firefox application and start it again. The new firefox container use the default network.

    Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com use the abcnetfirefox network.

    "},{"location":"common/1.0/docker_macvlan/#webhook-events-create-and-destroy-application","title":"Webhook events create and destroy application","text":"

    A rule support a specific bash command to notify external security equipment like firewalls, by sending create and destroy events.

    \"rules\": {  \"homedir\": { \"default\": false, \"ship\": true }, \n                \"network\": { \"default\": false, \n                    \"ship\": { \"name\": \"abcnetfirefox\", \n                                \"dns\": [ \"8.8.8.8\" ], \n                                \"webhook\": { \n                                    \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n                                    \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n                                } \n                    }\n                }\n}\n
    • When a new docker container is created, the control plane pyos execute the command
    /usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
    • When a new docker container is destoyed, the control plane pyos call the url
    /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n

    Each {{ $label }} is a mustached value.

    Label name description example container_ip container ip addr 192.168.8.130 provider authentification provider name planet providertype authentification provider type ldap userid authentification provider user id fry name username Philip J. Fry sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"

    The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'

    "},{"location":"common/1.0/docker_macvlan/#destroy-event","title":"destroy event:","text":"

    The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'

    "},{"location":"common/1.0/docker_macvlan/#desktopwebhook-options-in-odconfig-file","title":"desktop.webhook options in od.config file","text":""},{"location":"common/1.0/docker_macvlan/#url-encoding-parameters","title":"url encoding parameters","text":"

    To encode url parameters use the option desktop.webhookencodeparams. Set desktop.webhookencodeparams to True to encode label name. The default value is False

    "},{"location":"common/1.0/docker_macvlan/#additional-dict-datas","title":"additional dict datas","text":"

    Additional datas can be set using the desktop.webhookdict option in od.config file

    desktop.webhookdict: { \n        'api_key': 'supersecret', \n        'firewall_manage_ip': '161.105.208.129'  \n}\n

    The command line

    /usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n

    becomes

    /usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
    "},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop.io images to use your own.
    "},{"location":"common/1.0/update_frontend_image/#build-images","title":"Build images","text":"

    Build image process from abcdesktopio docker registry to your private registry

    "},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"

    Goal :

    • Custom web site colors
    • Change logo
    • Rename the web site name

    Only the name of the network is used by abcdesktop.

    "},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
    git clone https://github.com/abcdesktopio/webModules.git\n
    "},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

    Update your ui.json file. ui.json is located in var/webModules/transpile/config directory.

    # cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x   1 root root   4096 Feb  1 15:14 .\ndrwxr-xr-x   1 root root   4096 Feb  1 15:14 ..\n-rw-rw-r--   1 root root     34 Feb  1 15:14 .cache.json\n-rw-rw-r--   1 root root   2215 Feb  1 15:11 modules.json\n-rw-rw-r--   1 root root   1044 Feb  1 15:11 ui.json\n

    ui.json is a json dictionary file

    The main entry is name, name is the project name:

    entry default value example name abcdesktop.io acmedesktop.io
    {\n  \"name\": \"abcdesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
    "},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name to

    \"name\": \"acmedesktop.io\"\n

    and the

    @tertiary \"value\": \"#00BCD4\"\n

    Example

    {\n  \"name\": \"acmedesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#00FCD4\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
    "},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"
    FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
    "},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"

    Run the docker build command to build the new oc.nginx:acme image

    docker build -t oc.nginx:acme .\n
    Sending build context to Docker daemon  258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n

    Run the docker images command to read the new oc.nginx image

    docker images \n\nREPOSITORY                   TAG       IMAGE ID       CREATED             SIZE\noc.nginx                     acme      4de1755b60d7   About an hour ago   746MB\n
    "},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"

    Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx by the new image oc.nginx:acme name.

    version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'oc.nginx:acme'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n

    The run the docker-compose up, and start you web browser. You can read the new project name at the home page.

    We define the new tertiary color as #00FCD4 in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }

    Old tertiary color has been replace by #00FCD4.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":"
    • envsubst command preinstalled. Common Linux systems have envsubst preinstalled
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#goals","title":"Goals","text":"
    • Create a new containerised application from scratch using pod volume mapping
    • Start a pod and get a shell inside container as user root. Run xedit application as root
    • Start a pod and get a shell inside container as user hermes. Run xedit application as hermes
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-an-application-using-a-new-container","title":"Create an application using a new container","text":"

    We are starting a new containerised application from a fresh ubuntu:20.04 image and bind the X11 socket to use the pod DISPLAY.

    We start a new container one as root, and another one as current user hermes

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-abcdesktop-session","title":"Start a new abcdesktop session","text":"

    Open a web browser and go to abcdesktop service url

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"

    In the example we use LDAP authentification.

    The login is Hermes Conrad, the password is hermes

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-hermess-pod-variables-name-uid-xauth_key","title":"Get hermes's pod variables: name, uid, XAUTH_KEY","text":"

    Get a shell to your host. All next command use a host shell.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's pod name","text":"

    To read the hermes pod name, MIT-MAGIC-COOKIE-1, and uid

    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n

    We save this value in the pod variable, for next usage

    POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n

    You should read on stdout

    hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n

    We save this value in the $POD for a next usage.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-xauth_key","title":"Get the hermes's XAUTH_KEY","text":"

    The release 3.0 need the MIT-MAGIC-COOKIE-1 to reach the x11 DISPLAY.

    Run the command echo $XAUTH_KEY to read the $XAUTH_KEY value inside the hermes's pod

    export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
    Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n

    The XAUTH_KEY variable is exported for a next usage.

    echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid","text":"
    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n

    We save this value in the PODUID exported variable, for next usage

    export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
    echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID","text":"

    The default kubelet's pod directory is /var/lib/kubelet/pods/. If you change it during the installation process replace /var/lib/kubelet/pods/ by your own directory.

    ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
    ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root   60 Dec  8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec  8 19:43 ..\nsrwxrwxrwx 1 1051 2051    0 Dec  8 19:43 X0\n

    X0 is a file unix socket, we will bind the X0 socket in the next podapp.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-home-hermes-volume-location","title":"Get the hermes's pod home-hermes volume location","text":"
    kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n

    Description of this query

    • items[0] is the first entry of the pod list.
    • spec.volumes is an array
    • read all entries in spec.volumes where the @.name==\"home-hermes\" and return .hostPath.path

    We save this value in the PODHOME exported variable, for next usage

    export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n

    Check the value with a echo

    echo $PODHOME\n/tmp/hermes-conrad\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04","text":"

    Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume

    • to the X11 socket /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket:/tmp/.X11-unix
    • to the user homedir $PODHOME:/home/balloon
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-container-in-the-pod-sandbox-with-config-file","title":"Create container in the pod sandbox with config file","text":"

    We use envsubst to replace variable content in a template yaml file.

    Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:

    brew install gettext

    The variables ${PODUID}, ${PODHOME} and ${XAUTH_KEY} are exported.

    Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst

    Create a file podapp.template.yaml

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

    Run the envsubst command to replace ${PODUID}, ${PODHOME} and ${XAUTH_KEY}

    envsubst < podapp.template.yaml > podapp.yaml \n

    Dump the podapp.yaml file content, and check that the volumes are set with the new values.

    # cat podapp.yaml \n
    apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: /bin/sleep 1d\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n

    Create the application pod

    kubectl apply -f podapp.yaml \npod/podapp created\n

    Check that your pod podapp is Running

    kubectl get pods podapp  -n abcdesktop\nNAME     READY   STATUS    RESTARTS   AGE\npodapp   1/1     Running   0          32s\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp","text":"

    You get a shell command inside the container.

    kubectl exec -it podapp  -n abcdesktop -- bash \n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"
    apt-get update && apt-get install -y xauth\n
    export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n

    You can read on stdout

    root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth:  file /root/.Xauthority does not exist\nroot@podapp:/#\n

    The file /root/.Xauthority does not exist, it has been created.

    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#install-your-x11-applications","title":"Install your X11 applications","text":"

    For example, I choose to install the x11-apps package

    Replace x11-apps by your own application

    apt-get install -y x11-apps\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"

    To start the X11 application, just run it. Your DISPLAY is set to :0.0, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1).

    But remember you a running a container as root, and all commands are running as root inside the container.

    Start xedit

    xedit\n

    Go back to your web browser.

    A new x11 window xedit should be present on your display

    xedit doesn't write any error message in the bash container.

    You've get a shell inside a container to run and start any application. You can also install and start any others applications.

    To clean the running pod podapp

    kubectl delete pods podapp -n abcdesktop \n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04 as hermes","text":"

    To start a new container from ubuntu:20.04 as hermes, we have to add the localaccount secret volume to the previous container

    Read the securityContext from the hermes pod

    export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n

    Check the uidNumber and the gidNumber values

    echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n

    Create a file hermespodapp.template.yaml

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: ${PODRUNASUSER}\n    runAsGroup: ${PODRUNASGROUP}\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

    Create your hermespodapp.yaml file from the previous template

    envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n

    Look at your hermespodapp.yaml

    cat hermespodapp.yaml \n
    apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: 1051\n    runAsGroup: 2051\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: 306908f8e4d4768c7595ce5ad53479\n

    Create the hermespodapp

    kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n

    To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc to get a rooted shell.

    Read the containerID of the pod hermespodapp

    CONTAINER=$(kubectl -n abcdesktop  get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n

    Get the shell with runc command

    runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n

    This is correct group ID 2051 does not exit. Let's patch your file system with hermes credentials

    • /etc/passwd
    • /etc/group
    • /etc/shadow
    • /etc/gshadow
    rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n

    Now your files are updated. You can exit, and reopen a bash to your container

    root@hermespodapp:/# exit\n
    # runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n

    The error message does not appear anymore.

    Install your X11 applications as root

    apt-get update && apt-get install -y x11-apps\n

    Quit the root session

    exit\n
    "},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes","text":"

    Start a new session to the pod hermespodapp

    kubectl -n abcdesktop exec -it hermespodapp -- bash \n

    You get a shell prompt as as hermes. Check the hermes homedirectory and id number

    hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n

    Export the var DISPLAY and start the edit application. You don't need to create the .Xauthority file. /home/hermes is already mounted as a volume.

    hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n

    This process is running as hermes :

    hermes@hermespodapp:~$ ps -ef\nUID          PID    PPID  C STIME TTY          TIME CMD\nhermes         1       0  0 15:57 ?        00:00:00 /bin/sleep 1d\nhermes       690       0  0 16:47 pts/0    00:00:00 bash\nhermes       699     690  0 16:48 pts/0    00:00:00 xedit\nhermes       700     690  0 16:49 pts/0    00:00:00 ps -ef\n

    Go back to your web browser.

    A new x11 window xedit should be present on your display

    The name of the edit window is the name of your pod (hermespodapp).

    To clean the running pod hermespodapp

    kubectl delete -f hermespodapp.yaml \n

    You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.

    "},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"

    Only supported in abcdesktop release 3.0

    An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.

    You must have your own NFS server running with the share exported before you can use it.

    "},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update the od.config file","text":"

    Update the od.config to add

    • a label to user
    • add a desktop rules to match the label
    "},{"location":"common/3.0/mount_nfs_tag/#add-a-label-in-the-auth-provider","title":"Add a label in the auth provider","text":"

    In this example, we add a label nfsuser as a condition to mount nfs resource

    In the auth provider add a dummy condition or a memberOf condition. All types of conditions are supported, the goal is only to get a label.

    Update the od.config file and look for the default ldapconfig dictionnary

    "},{"location":"common/3.0/mount_nfs_tag/#add-a-dummy-condition","title":"Add a dummy condition","text":"
    ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-dummy': { \n             'conditions' : [ { 'boolean': True, 'expected' : True  } ],\n             'expected' : True,\n             'label': 'nfsuser' } } } } } }\n
    "},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf condition","text":"
    ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-nfsuser':  { \n              'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ],\n              'expected' : True, \n              'label': 'nfsuser' } } } } }\n
    "},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule in the desktop.policies","text":"

    In this example, we define entries :

    • nfsserver is 192.168.7.101 (can also be a FQDH)
    • path is /volume1/isostore
    • mountPath is /mnt/iso

    The mount command become like:

    mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n

    Update the desktop.policies dictionnary and add a new key rules. In the new rules define a new entry nfsuser.

    The name of the entry MUST match a user label tag, else the mount point is not created.

    In this example the label is defined as nfsuser, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume

    desktop.policies: {  \n'acls' : {},\n'rules': { \n  'volumes': { \n    'nfsuser': {\n      'type': 'nfs', \n      'name': 'isostore', \n      'server': '192.168.7.101',\n      'path': '/volume1/isostore',\n      'mountPath': '/mnt/iso',\n      'readOnly': True } } } } \n
    "},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config file","text":"

    Save your local changes in od.config, and update the new configmap abcdesktop-config

    kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
    "},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos","text":"

    Restart pyos pods

    kubectl delete pod -l run=pyos-od -n abcdesktop\n
    pod \"pyos-od-5586b88767-64jwt\" deleted\n
    "},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad and list nfs files","text":"

    Open the url http://localhost:30443, in your web browser, to start a simple user's pod.

    http://localhost:30443\n
    • Login with a user Hermes Conrad for example. Hermes Conrad is member of admin_staff.

    • Check that the label nfsuser is listed

    • Run a web shell to list the /mnt/iso directory content

    You can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section

    "},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"

    Let talk about a common features with multiple groups and user securityContext on pods

    "},{"location":"common/3.0/multiplegroupsfeature/#context","title":"context","text":"
    • Use ldap auth like in sample config ou=people,dc=planetexpress,dc=com
    • Use groups gidNumber and uidNumber
    • Use filesystem access right
    "},{"location":"common/3.0/multiplegroupsfeature/#goal","title":"Goal","text":"
    • Use the kubernetes supplemental groups support
    • Define accounts in ldap directory service to get supplementalGroups support
    "},{"location":"common/3.0/multiplegroupsfeature/#check-the-kubernetes-supplementalgroups-support","title":"Check the kubernetes supplementalGroups support","text":"

    Let's create a yaml file to define pod with securityContext and supplementalGroups

    apiVersion: v1\nkind: Pod\nmetadata:\n  name: security-context-supplementalgroups-demo\nspec:\n  securityContext:\n    runAsUser: 1000\n    runAsGroup: 3000\n    supplementalGroups: [2000,4000,5000,6000]\n  volumes:\n  - name: sec-ctx-vol\n    emptyDir: {}\n  containers:\n  - name: sec-ctx-demo\n    image: busybox:1.28\n    command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n    volumeMounts:\n    - name: sec-ctx-vol\n      mountPath: /data/demo\n    securityContext:\n      allowPrivilegeEscalation: false\n

    Create the pod security-context-supplementalgroups-demo

    $ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n

    The pod is created

    pod/security-context-supplementalgroups-demo created\n

    Test the id command, you get the list uid=1000 gid=3000 groups=2000,4000,5000,6000

    $ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n

    Run the group command inside the pod

    $ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n

    The result exit with code 1. The groups do not exist in /etc/group

     3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n

    This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid, gid and supplementalgroups are read from posixAccount and posixGroup in the directory service.

    "},{"location":"common/3.0/multiplegroupsfeature/#read-specsecuritycontext-from-a-pod","title":"Read .spec.securityContext from a pod","text":"

    kubectl command to read .spec.securityContext

    kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n

    You read as output

    {\n  \"runAsGroup\": 3000,\n  \"runAsUser\": 1000,\n  \"supplementalGroups\": [\n    2000,\n    4000,\n    5000,\n    6000\n  ]\n}\n
    "},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"
    • defined a user in the LDAP series

    The complete ldif file can be downloaded at the end of this page.

    The ldif set :

    • organizationalUnit people: ou=people,dc=planetexpress,dc=com
    • organizationalUnit groups: ou=groups,dc=planetexpress,dc=com

    Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com - gidNumber: 1036 - uid: hermes - uidNumber: 1035

    Create a posixGroup for hermes : cn=hermes,ou=groups,dc=planetexpress,dc=com

    • objectClass: posixGroup
    • objectClass: top
    • cn: hermes
    • gidNumber: 1036

    Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com

    • cn: accountant
    • gidNumber: 18430
    • memberUid: hermes

    Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com

    • gidNumber: 20467
    • memberUid: fry
    • memberUid: hermes
    "},{"location":"common/3.0/multiplegroupsfeature/#login-to-abcdesktop","title":"Login to abcdesktop","text":"

    Login to abcdesktop as Hermes Conrad account

    Inside the user pod, the unix group file contains :

    cat /etc/group\n
    hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

    This is correct.

    The user's pod is defined with a securityContext

    In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27 by your own pod's name

    kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext'  \n

    You can read on stdout

    {\n  \"runAsGroup\": 1036,\n  \"runAsUser\": 1035,\n  \"supplementalGroups\": [\n    20467,\n    18430\n  ]\n}\n

    This is correct. supplementalGroups defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com

    Inside the user pod run the id command

    hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

    This is correct.

    "},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"

    The default home directory in od.config is a volume hostPath set to /tmp

    desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

    On your host server, get a shell with as root account, create a file humansfile with restricted access to member of humans group.

    cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

    Check the owner and group of the new file humansfile

    ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

    Check inside the user pod check that hermes account can write data in the new file humansfile.

    This is correct hermes is member of humans group.

    hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
    hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

    This is correct.

    The user's pod is defined with a securityContext

    'securityContext': {\n  'runAsUser': 1035,\n  'runAsGroup': 1036,\n  'supplementalGroups': [20467, 18430] \n}\n

    This is correct. supplementalGroups defines the others groups from LDAP

    Inside the user pod run the id command

    hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

    This is correct.

    "},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"

    The default home directory in od.config is a volume hostPath set to /tmp

    desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

    On your host server, using a root account, create a file humansfile with restricted access to member of humans group.

    cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

    Check the owner and group

    ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

    Check inside the user pod check that hermes account can to write data in file humansfile, because hermes is member of humans group.

    hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n

    This is correct.

    We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

    "},{"location":"common/3.0/multiplegroupsfeature/#ldap-ldif-dump","title":"LDAP ldif dump","text":"

    To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

    version: 1\n=======\nhermes:~$ \n

    This is correct.

    We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

    "},{"location":"common/3.0/multiplegroupsfeature/#ldif-dump","title":"ldif dump","text":"

    To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

    version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
    "},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":"

    abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

    "},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":"
    • docker package installed
    "},{"location":"common/3.0/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop default frontend web page to use your own.
    • Create new image for abcdesktop oc.nginx
    "},{"location":"common/3.0/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

    In the od.config, add the env var ABCDESKTOP_BG_COLOR

    desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

    Then update the config map abcdesktop-config and restart deployment pyos-od

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

    You should read on stdout

    configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n
    "},{"location":"common/3.0/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.0/update_frontend_image/#download-uijson-file","title":"Download ui.json file","text":"

    Download the ui.json file. ui.json is located in webModules/transpile/config directory of webModules abcdesktop's repository.

    mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n

    ui.json is a json dictionary file

    The main entres are :

    • name, name is the name of your project.
    • projectNameSplitedHTML, is the animated span name of your project.
    entry default value example name abcdesktop.io acmedesktop.io projectNameSplitedHTML <span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span> <span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
    {\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name of the project, and projectNameSplitedHTML to

      \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n

    Change the color @x11bgcolor with your own.

    entry name new color value @x11bgcolor #18974c

    You should use the same value for ABCDESKTOP_BG_COLOR and for @x11bgcolor.

    Example

    {\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n   \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974C\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile to build the new image","text":"

    Dockerfile

    #\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder          \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
    "},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"

    Run the docker build command to build the new oc.nginx:acme image

    docker build -t oc.nginx:acme .\n
    # docker build -t oc.nginx:acme .\nSending build context to Docker daemon  21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.2\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.2\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\"       maintainer=\"acmedesktop\"       version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n

    Run the docker images command to read the new oc.nginx image

    docker images \n\nREPOSITORY              TAG       IMAGE ID       CREATED         SIZE\noc.nginx                acme      b5449d85393f   2 minutes ago   685MB\n
    "},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"
    docker image save oc.nginx:acme -o oc.nginx.acme\n
    "},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme in k8s.io namespace for containerd","text":"

    The oc.nginx.acme not is listed in the k8s.io namespace.

    Run the ctr command line to import oc.nginx.acme

    ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n

    Check that your new image is listed

    ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme                                                                                                  application/vnd.docker.distribution.manifest.v2+json      sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64                                                                                                                        io.cri-containerd.image=managed \n
    "},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"

    Update your own abcdesktop.yaml file to replace the default image abcdesktopio/oc.nginx:3.0 by the new container image oc.nginx:acme name.

     containers:\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.2\n

    Replace :

    • image: abcdesktopio/oc.nginx:3.2 by image: oc.nginx:acme
     containers:\n      - name: nginx\n        image: oc.nginx:acme\n

    Apply the new abcdesktop.yaml file

    kubectl apply -f abcdesktop.yaml \n

    The deployment.apps/nginx-od is configured

    clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n

    Start you web browser. You can read the new project name at the home page. After login you get the new color.

    You have updated the html web page for abcdesktop release 3.X

    "},{"location":"common/3.3/update_frontend_image/","title":"Update and custom frontend web page","text":"

    abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

    "},{"location":"common/3.3/update_frontend_image/#requirements","title":"Requirements","text":"
    • docker package installed
    "},{"location":"common/3.3/update_frontend_image/#goals","title":"Goals","text":"
    • Update abcdesktop default frontend web page to use your own.
    • Create new image for abcdesktop oc.nginx
    "},{"location":"common/3.3/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

    In the od.config, add the env var ABCDESKTOP_BG_COLOR

    desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

    Then update the config map abcdesktop-config and restart deployment pyos-od

    kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

    You should read on stdout

    configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n

    The new desktop is defined with the default background color

    We need to change the top color with the same new default value #18974c

    Update the oc.nginx container image to add #18974c inside the new graphic chart.

    "},{"location":"common/3.3/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.3/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
    git clone -b 3.3 https://github.com/abcdesktopio/webModules.git\n
    "},{"location":"common/3.3/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/3.3/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

    Update your ui.json file. ui.json is located in transpile/config directory.

    ls -la  webModules/transpile/config\ntotal 204\ndrwxr-xr-x   5 alexandredevely  staff   160 Nov 29 14:54 .\ndrwxr-xr-x  11 alexandredevely  staff   352 Nov 29 14:54 ..\n-rw-r--r--   1 alexandredevely  staff    34 Nov 29 14:54 .cache.json\n-rw-r--r--   1 alexandredevely  staff  1924 Nov 29 14:54 modules.json\n-rw-r--r--   1 alexandredevely  staff  1548 Nov 29 14:54 ui.json\n

    ui.json is a json dictionary file

    The main entry is name, name is the project name:

    entry default value example name abcdesktop.io acmedesktop.io
    {\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='p\nrojectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.3/update_frontend_image/#login-progress","title":"Login progress","text":"

    Login progress is embedded in span HTML tags. Each projectNameSplitedStage describes a step during the user's authentification then pod's creation process.

    • projectNameSplitedStagea: step 1
    • projectNameSplitedStageb: step 2
    • projectNameSplitedStagec: step 3
    • projectNameSplitedStaged: step 4
    <span id='projectNameSplitedStagea'>a</span>\n<span id='projectNameSplitedStageb'>b</span>\n<span id='projectNameSplitedStagec'>c</span>\n<span id='projectNameSplitedStaged'>desktop</span>\n
    "},{"location":"common/3.3/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/3.3/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

    Change for example the name abcdesktop to acmedesktop

    \"name\": \"acmedesktop.io\"\n

    Update the projectNameSplitedHTML values, the @tertiary and @x11bgcolor colors

        {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974c\"\n    },\n

    Example with new acmedesktop

    {\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='p\nrojectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
    "},{"location":"common/3.3/update_frontend_image/#build-your-new-image","title":"build your new image","text":"

    Run the docker build command to build the new oc.nginx:acme image

    The target image is abcdesktopio/oc.nginx:acme you should change it with your own for example myacme/oc.nginx:acme

    docker build --build-arg NODE_MAJOR=20 --build-arg BASE_IMAGE=abcdesktopio/oc.nginx.builder --build-arg BASE_IMAGE_RELEASE=3.3 --build-arg TARGET=dev  -t abcdesktopio/oc.nginx:acme -f Dockerfile .\n
    docker build --build-arg NODE_MAJOR=20 --build-arg BASE_IMAGE=abcdesktopio/oc.nginx.builder --build-arg BASE_IMAGE_RELEASE=3.3 --build-arg TARGET=prod  -t abcdesktopio/oc.nginx:acme -f Dockerfile .\n[+] Building 16.5s (19/19) FINISHED                                                                                                                          docker:default\n => [internal] load build definition from Dockerfile                                                                                                                   0.0s\n => => transferring dockerfile: 962B                                                                                                                                   0.0s\n => [internal] load metadata for docker.io/library/nginx:latest                                                                                                        0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.nginx.builder:3.3                                                                                           0.0s\n => [internal] load .dockerignore                                                                                                                                      0.0s\n => => transferring context: 2B                                                                                                                                        0.0s\n => CACHED [stage-1 1/2] FROM docker.io/library/nginx:latest                                                                                                           0.0s\n => CACHED [builder  1/11] FROM docker.io/abcdesktopio/oc.nginx.builder:3.3                                                                                            0.0s\n => [internal] load build context                                                                                                                                      0.1s\n => => transferring context: 265.27kB                                                                                                                                  0.1s\n => [builder  2/11] RUN echo current branch is                                                                                                                         0.2s\n => [builder  3/11] RUN echo NODE release is 20                                                                                                                        0.2s\n => [builder  4/11] RUN echo current target is prod it can be 'dev' or 'prod'                                                                                          0.2s\n => [builder  5/11] COPY . /var/webModules                                                                                                                             0.4s\n => [builder  6/11] WORKDIR /var/webModules                                                                                                                            0.1s\n => [builder  7/11] RUN make clean                                                                                                                                     0.7s\n => [builder  8/11] RUN make prod                                                                                                                                      9.7s\n => [builder  9/11] RUN ./mkversion.sh && cat version.json                                                                                                             0.2s\n => [builder 10/11] RUN /myenv/bin/html5validator index.html                                                                                                           2.0s \n => [builder 11/11] RUN make removebuildtools                                                                                                                          0.8s \n => [stage-1 2/2] COPY --from=builder /var/webModules /usr/share/nginx/html                                                                                            0.7s \n => exporting to image                                                                                                                                                 0.7s \n => => exporting layers                                                                                                                                                0.7s \n => => writing image sha256:d7bdbc9f7fafe3282161551e84c5997bb12051bded6405190267863dd73a1698                                                                           0.0s\n => => naming to docker.io/abcdesktopio/oc.nginx:acme  \n
    "},{"location":"common/3.3/update_frontend_image/#update-the-abcdesktopyaml","title":"update the abcdesktop.yaml","text":"

    To update the abcdesktop.yaml to replace abcdesktopio/oc.nginx:3.3 by your own image myacme/oc.nginx:acme

    • edit your own abcdesktop.yaml file
          [...]\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.3\n        ports:\n          - containerPort: 80\n            name: http\n      [...]\n

    Update the deployement with your new image name abcdesktopio/oc.nginx:acme

          [...]\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:acme\n        ports:\n          - containerPort: 80\n            name: http\n      [...]\n

    apply your abcdesktop.yaml file

    kubectl apply -f abcdesktop.yaml\n
    role.rbac.authorization.k8s.io/pyos-role unchanged\nrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nconfigmap/configmap-mongodb-scripts unchanged\nsecret/secret-mongodb configured\ndeployment.apps/mongodb-od configured\ndeployment.apps/memcached-od configured\ndeployment.apps/router-od configured\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od configured\ndeployment.apps/pyos-od configured\ndeployment.apps/console-od configured\ndeployment.apps/openldap-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/pyos unchanged\nservice/console unchanged\nservice/http-router unchanged\nservice/website unchanged\nservice/openldap unchanged\n
    "},{"location":"common/3.3/update_frontend_image/#connect-to-your-new-website","title":"Connect to your new website","text":"

    Open your web browser to your abcdesktop website

    • acmedesktop login page

    • acmedesktop login process

    • acmedesktop colors updated

    "},{"location":"core/memcached/","title":"Memcached","text":"

    The memcached container comes from the public docker registry. This service is attend to the netback network.

    memcached store pods and containers message during the create process.

    "},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"

    Messages stored into memcache

    status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"

    Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.

    The mongodb container comes from the public docker registry. This service is attend to the netback network.

    "},{"location":"core/mongodb/#collections","title":"Collections","text":"

    abcdesktop.io uses the colections mongodb to store

    • webrtc call history
    • login history
    • dock web state
    "},{"location":"core/mongodb/#dock-state","title":"dock state","text":"
    • The dock state is stored as an array of application name.
    • The dock state is stored when the user changes it (for exemple add or remove an application inside the dock zone ).
    • The collection's name is the userid. The key's name is 'dock'
    [ \n    \"keyboard\",\n    \"frontendjs.filemanager\",\n    \"Mail.Thunderbird\",\n    \"libreoffice.libreoffice-calc\",\n    \"libreoffice.libreoffice-writer\",\n    \"Navigator.Firefox\",\n    \"gimp.Gimp\",\n    \"gnome-terminal.Gnome-terminal\"\n]\n
    "},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"
    • Login History is an object collection.
    • One collection is created for each user.
    • The collection's name is the userid.
    • The javascript code can only read and NEVER write data to the loginHistory collection.

    The object's format is :

    {\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
    • _id : is the mongodb id
    • sub : is the userid
    • ipaddr : is the client ip address
    • provider : authenticated provider
    • date : date formated
    • useragent : user browser description
    • name : the user name
    "},{"location":"core/mongodb/#method","title":"method","text":"

    The method getCollection, is a ligth way to get a collection on the fron-end side.

    For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.

     getCollection('loginHistory', function(msg) {\n            if (msg.status === 200) {\n                var history = msg.result;\n                loginHistory = history;\n                buildHtmlTable(history);\n            }\n        })\n
    "},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"

    Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).

    "},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":"
    • Read the nginx nginx.conf configuration file
    • Read the nginx default web site configuration file
    • Read the route.conf configuration file, use to route HTTP request
    • Read the proxy.conf configuration file, use to proxy HTTP request
    "},{"location":"core/nginx/#web-site","title":"web site","text":"

    The static files (html, css, js) are stored in the local /var/webModules directory.

    "},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":"
    • moauth|fauth|gauth|oauth|autologin|API|status are routed to od.py http://$my_proxy:$api_service_tcp_port;
    • /spawner is routed to nodejs spawner service http://$target:$spawner_service_tcp_port;
    • /websockify is routed to websocket http://$target:$ws_tcp_bridge_tcp_port/;
    • /u8_1_11025 is routed to pulseaudio sound service http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;
    • /filer is routed to nodejs filer service http://$target:8080
    • /broadcast is routed to nodejs broadcast service http://$target:$broadcast_tcp_port;
    "},{"location":"core/nginx/#lua-scripts","title":"LUA scripts","text":"

    The /etc/nginx/get.targetmap.lua read the jwt_token and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key and the jwt_desktop_payload_private_key

    It uses a targetmap (dict) as first cache level.

    lua_shared_dict targetmap 1m;\n

    Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.

    "},{"location":"core/ocuser/","title":"The POD User","text":"

    After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.

    "},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"

    The pod user runs by default a container with the graphical image : the oc.user.18.04.

    A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage and desktop.printerimage].

    "},{"location":"core/ocuser/#processes-running-inside-the-user-container","title":"Processes running inside the user container","text":"

    All processes are running as the user named balloon, because none of theme need to run as root.

    The userid and the guid are 4096.

    "},{"location":"core/ocuser/#supervisord","title":"Supervisord","text":"

    Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.

    /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n

    Supervisor is the parent of all running process

    docker-entrypoi---supervisord-+-Xvnc\n                              |-node---10*[{node}]\n                              |-4*[nodejs---10*[{nodejs}]]\n                              |-nodejs---6*[{nodejs}]\n                              |-nodejs-+-bash---pstree\n                              |        `-11*[{nodejs}]\n                              |-openbox\n                              `-xsettingsd\n
    "},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"

    TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.

    Starts parameters

    command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n

    The default DISPLAY is :0. Xvnc listen on unix socket file /tmp/.x11vnc.

    "},{"location":"core/ocuser/#openbox","title":"Openbox","text":"

    Openbox is the window manager, it supports extensive standards support.

    Openbox is patched with few line to send SIG_USR1 and SIG_USR2 messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.

    This patch add notification when X11/window change :

    The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)

    #define SIG_MANAGED_WINDOW   SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n
    • SIGUSR1: when a new window is created
    • SIGUSR2: when a window is closed

    Openbox is started by supervisord using the command :

    command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
    "},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"

    ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

    ws-tcp-bridge is started by supervisord using the command :

    /composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
    "},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"

    spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :

    • launch: start a new application inside the container [ use for builtin applications ]
    • filesearch: search file by keywords
    • activate: activate a window
    • raise: raise a window
    • minimize: minimize a window
    • close: close a window
    • getwindowslist: get window list
    • activatewindow: activate a window
    • closewindow
    • minimizewindow
    • raisewindow
    • info: get container information
    • clipboardsync: Sync primary clipboard to gtk default clipboard
    • getbroadcastwindowslist: broadcast the window list to all connected users
    • getappforfile: get the application key for a filename
    • getmimeforfile: get the mime type for a filename
    • echo: return an echo string

    spawner-service.js is started by supervisord using the command :

    command=nodejs /composer/node/spawner-service/spawner-service.js\n
    "},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"

    Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :

    command=nodejs /composer/node/printer-service/printer-service.js\n
    "},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"

    Broadcast-service.js allows to broadcast messages between all user sharing the same session.

    Broadcast-service.js is started by supervisord using the command :

    command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
    "},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"

    File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.

    http.createServer(function(req, res) {\n  if (req.method === 'POST') {\n    uploadFile( req, res );\n  } \n  else if (req.method === 'GET') {\n        respondFile( req, res );\n  }\n}).listen(8080, function() {\n  console.log('Listening for requests');\n});\n

    File-service.js is started by supervisord using the command :

    command=nodejs /composer/node/file-service/file-service.js\n
    "},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"

    PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.

    file etc/pulse/default.pa

    load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n

    Pulseaudio is started by supervisord using the command :

    command=/usr/bin/pulseaudio\n
    "},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"

    Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:

    Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n

    Xsettingsd is started by supervisord using the command.

    command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
    "},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"

    The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.

    +-------------------+\n| oc.user.18.04     |       (abcdesktop.io custom software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.software.18.04 |       (abcdesktop.io ubuntu software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.ubuntu.18.04   |       (abcdesktop.io ubuntu service)\n+-------------------+\n          |\n+---------+---------+\n|   ubuntu:18.04    |   (official ubuntu images from dockerhub)\n+-------------------+\n

    To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.

    docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04   -f oc.user.18.04 .\n

    To do it automaticly, clone composer/dockerbuild and run the Makefile

    git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
    "},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"

    oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:

    • nodejs: use by services
    • tiger VNC: X11 server
    • supervisor: service manager
    • xsettingsd: for X11 params
    • pulseaudio: fo sound
    • openbox: the windows manager
    • cups and cups-pdf: for printing support
    "},{"location":"core/ocuser/#dockerfile-ocsoftwarexxyy","title":"Dockerfile oc.software.XX.YY","text":"

    oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:

    • gnome-terminal
    • xclip
    "},{"location":"core/ocuser/#dockerfile-ocuserxxyy","title":"Dockerfile oc.user.XX.YY","text":"

    oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:

    "},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"
    # Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install  \nRUN cd /composer/node/file-service      && npm install\nRUN cd /composer/node/printer-service   && npm install\nRUN cd /composer/node/spawner-service   && npm install  \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
    "},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"
    RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
    "},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"
    # change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN     chown -R $BUSER:$BUSER /var/spool/cups            && \\\n        chown -R $BUSER:$BUSER /var/spool/cups-pdf      && \\\n        chown -R $BUSER:$BUSER /var/log/cups                && \\\n        chown -R $BUSER:$BUSER /var/cache/cups          && \\\n        chown -R $BUSER:$BUSER /etc/cups/printers.conf  && \\\n        chown -R $BUSER:$BUSER /var/run/cups/\n
    "},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"

    Datas to these tcp ports are routed by nginx

    PULSEAUDIO_HTTP_PORT                4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT      6081\nRESERVED_FOR_NEXT_VERSION           29780\nXTERM_TCP_PORT                      29781\nFILE_SERVICE_TCP_PORT               29783\nBROADCAST_SERVICE_TCP_PORT          29784\nRESERVED FOR CUPSD                  29785\nSPAWNER_SERVICE_TCP_PORT            29786\n
    "},{"location":"core/pyos/","title":"pyos","text":"

    oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :

    • 'login' : Request a login session, create a new user container if it does not exist.
    • 'getkeyinfo' : Return the public key from a provider
    • 'logout' : logout the container
    • 'logs' : return logs from a started container
    • 'getapplist' : return all avalaible applications
    • 'install' : [ deprecated ] install a package
    • 'share' : send a auth token to the email to share the desktop
    • 'support' : send a support request
    • 'restart' : retart the user container
    • 'ocrun' : start a application
    • 'ocstop' : stop the container
    • 'whoami' : return a JSON object whoami
    • 'set' : set a key value
    • 'get' : get value from a key
    • 'setcollection' : add value to a collection
    • 'getcollection' : get all values from a collection
    "},{"location":"core/speedtest/","title":"SpeedTest","text":"

    The speedtest container comes from the public docker registry.

    "},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"

    LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.

    "},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    A sample API

    Base URLs:

    • /
    "},{"location":"services/file-service/#file-service-default","title":"Default","text":""},{"location":"services/file-service/#get__","title":"get__","text":"

    GET /

    Get file from the home directory

    Example responses

    403 Response

    "},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"

    POST /

    Upload a file at a given path

    Body parameter

    Example responses

    200 Response

    "},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"

    DELETE /

    Remove a given file wich is present in home directory

    Body parameter

    {\n  \"myFilename\": \"string\"\n}\n
    "},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none

    Example responses

    200 Response

    "},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 400

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 403

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 500

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"

    GET /directory/list

    List files in a given directory

    "},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    A sample API

    Base URLs:

    • /
    "},{"location":"services/spawner-service/#spawner-service-default","title":"Default","text":""},{"location":"services/spawner-service/#get__version","title":"get__version","text":"

    GET /version

    Get User container version

    Example responses

    200 Response

    {\n  \"date\": null,\n  \"commit\": \"string\",\n  \"version\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"

    POST /launch

    Used to run builtin application process

    Body parameter

    {\n  \"command\": \"string\",\n  \"args\": [\n    \"string\"\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"

    POST /setAudioQuality

    Set the audio quality

    Body parameter

    {\n  \"sink\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"

    POST /playAudioSample

    Play a sample audio

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"

    PUT /configurePulse

    Configure pulse audio for Janus

    Body parameter

    {\n  \"destinationIp\": \"string\",\n  \"port\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"

    POST /broadcastwindowslist

    Emit a broadcast with window list as data

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"

    POST /clipboardsync

    Synchronize X11 and gtk clipboard

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"

    POST /setDesktop

    Store a data as json file in desktop

    Body parameter

    {\n  \"key\": \"string\",\n  \"value\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"

    GET /getDesktop

    Get a data stored as json file

    "},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"

    GET /getmimeforfile

    Get a mime for a given filename

    "},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true none

    Example responses

    200 Response

    {\n  \"data\": {}\n}\n
    "},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"

    GET /filesearch

    Used for list files by dock

    "},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"file\": \"string\",\n      \"mime\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"

    POST /generateDesktopFiles

    Build desktop files to run containerized applications

    Body parameter

    {\n  \"list\": [\n    {\n      \"mimetype\": \"string\",\n      \"path\": \"string\",\n      \"executablefilename\": \"string\",\n      \"icon\": \"string\",\n      \"name\": \"string\",\n      \"launch\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"

    GET /getappforfile

    Allow to get the app necessary

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"

    GET /about

    Get system informations

    Example responses

    200 Response

    {\n  \"hostname\": \"string\",\n  \"ipaddr\": \"string\",\n  \"plateform\": \"string\",\n  \"arch\": \"string\",\n  \"release\": \"string\",\n  \"cpu\": \"string\",\n  \"clientipaddr\": \"string\",\n  \"country\": \"string\",\n  \"language\": \"string\",\n  \"build\": \"string\",\n  \"POD_NAMESPACE\": \"string\",\n  \"POD_NAME\": \"string\",\n  \"NODE_NAME\": \"string\",\n  \"POD_IP\": \"string\",\n  \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"

    GET /getSettings

    Get configuration for settings window

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"tab\": \"string\",\n      \"enabled\": true\n    }\n  ]\n}\n
    "},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"

    POST /setBackgroundColor

    Change the background color

    Body parameter

    {\n  \"color\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"

    POST /setBackgroundImage

    Set the background image

    Body parameter

    {\n  \"imgName\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": {\n    \"color\": \"string\",\n    \"subData\": {\n      \"code\": 0,\n      \"data\": \"string\"\n    }\n  }\n}\n
    "},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"

    POST /setDefaultImage

    Set the default image as background

    Example responses

    200 Response

    "},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

    Status Code 404

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"

    GET /getwindowslist

    Get window list

    Example responses

    200 Response

    "},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"

    Status Code 200

    Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"

    POST /activatewindows

    Activate windows

    Body parameter

    {\n  \"windowsid\": [\n    0\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"

    POST /closewindows

    Close windows

    Body parameter

    {\n  \"windowsid\": [\n    0\n  ]\n}\n
    "},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"

    POST /placeAllWindows

    Place and resize all windows

    Example responses

    200 Response

    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
    "},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"
    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n
    "},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"
    {\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n

    All operations completed with success

    "},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"
    {\n  \"code\": 0,\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"
    {\n  \"code\": 0,\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"
    {\n  \"data\": {}\n}\n\n
    "},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"
    {\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n\n
    "},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"

    Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.

    abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io

    This article is just an update from Fabian St\u00e4ber work.

    "},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"

    Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.

    Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.

    "},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"

    The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/.

    The plugin directory can be configured with the kubelet's --volume-plugin-dir parameter, run ps aux | grep kubelet to learn the location of the plugin directory on your system (see [#1][9]). The cifs script must be located in a subdirectory named abcdesktop~cifs/. The directory name abcdesktop~cifs/ will be mapped to the Flexvolume driver name abcdesktop/cifs.

    On the Kubernetes master and on each Kubernetes node run the following commands:

    VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n

    The cifs script requires a few executables to be available on each host system:

    • mount.cifs, on Ubuntu this is in the cifs-utils package.
    • jq, on Ubuntu this is in the jq package.
    • mountpoint, on Ubuntu this is in the util-linux package.
    • base64, on Ubuntu this is in the coreutils package.
    apt-get install cifs-utils jq util-linux coreutils\n\n

    To check if the installation was successful, run the following command:

    VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n

    It should output a JSON string containing \"status\": \"Success\". This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.

    "},{"location":"setup/kubernetes_flexvolume/#update-your-odconfig-file","title":"Update your od.config file","text":"

    In this example, we use a Microsoft Active Directory as a LDAP Server.

    CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode

    Add a new policy to add a label TAG during the user's authentification process.

    \n# Add an explicit authmanagers\nauthmanagers: { \n    'explicit': {\n        'show_domains': True,\n        'default_domain': 'AD',\n        'providers': {\n          'AD': { \n            'config_ref': 'adconfig', \n            'enabled': True\n           }\n        }\n    }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ '192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                       'policies'      : { 'acls': None,\n                                           'rules' : { 'rule-domainuser' : {\n                                                  'conditions' : [ { 'primarygroupid': '513', 'expected' : True  } ],\n                                                  'expected'   : True,\n                                                  'label'      : 'domainuser' } \n} } } } } } }\n\n

    In this example :

    • To verify that a user is member of DOMAIN USER group, we check that the user's primaryGroupID is equal to 513
    • If the primaryGroupID is equal to 513 the authentification process add the label domainuser

    Then in the same od.config file, add rules to the desktop object to match this label domainuser

    desktop.policies: { 'rules': { 'volumes': { 'domainuser':  { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n                        'acls' : {} }\n\n

    In this example :

    • If the user's label is equal domainuser, then the user attribut homeDir is mounted to the homeDirectory by the CIFS flexvolume plugin.
    "},{"location":"setup/kubernetes_flexvolume/#testing","title":"Testing","text":""},{"location":"setup/kubernetes_flexvolume/#apply-new-configuration-file","title":"Apply new configuration file","text":"
    kubectl apply -f abcdesktop.yml\n

    Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.

    Run authentification on the Microsoft Active Direcotry Service or on your Samba server

    Start the File Manager application. In this example, the homeDir is set to U:, the mount entry become the letter U.

    Click on the homeDir to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex contains a file ```NAS-file.ods'

    "},{"location":"setup/kubernetes_flexvolume/#troubleshooting","title":"Troubleshooting","text":"

    Logs files are stored in host directory /var/log/abcdesktop/cifs

    # ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c.   1 12:00 ..\n-rw-r--r-- 1 root root  288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root  832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n-rw-r--r-- 1 root root   50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root   44 d\u00e9c.  22 12:20 umount.counter\n

    Check the file sAMAccountName.log, cifs.log

    If there is an error, look at the error.$sAMAccountName.json and error.$sAMAccountName.log

    Example

    -rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n

    Run mount command

    mount

    In this example :

    • 192.168.7.101 is the IP Address of the NAS server
    • //192.168.7.101/alex is the shared ressource
    • alex is the sAMAccountName
    # mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n

    Check that the kubernetes secrets exist

    kubectl get secrets -n abcdesktop\nNAME                                  TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload           Opaque                                2      65d\nabcdesktopjwtdesktopsigning           Opaque                                2      65d\nabcdesktopjwtusersigning              Opaque                                2      65d\nauth-cifs-alex-flexvol-cifs-homedir   abcdesktop/cifs                       4      10m\nauth-ldif-alex                        abcdesktop/ldif                       11     10m\n
    "},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"

    File need to be written

    "}]} \ No newline at end of file diff --git a/services/file-service/index.html b/services/file-service/index.html index 778770975..e968d5215 100644 --- a/services/file-service/index.html +++ b/services/file-service/index.html @@ -1802,6 +1802,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/services/spawner-service/index.html b/services/spawner-service/index.html index 9a2346790..25a9bb845 100644 --- a/services/spawner-service/index.html +++ b/services/spawner-service/index.html @@ -2033,6 +2033,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/setup/kubernetes_flexvolume/index.html b/setup/kubernetes_flexvolume/index.html index 95ee8faf7..23be99080 100644 --- a/setup/kubernetes_flexvolume/index.html +++ b/setup/kubernetes_flexvolume/index.html @@ -1832,6 +1832,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/setup/kubernetes_networkpolicies/index.html b/setup/kubernetes_networkpolicies/index.html index b98481094..e195aa2c5 100644 --- a/setup/kubernetes_networkpolicies/index.html +++ b/setup/kubernetes_networkpolicies/index.html @@ -1777,6 +1777,112 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + diff --git a/sitemap.xml b/sitemap.xml index 0986dcd2c..b775ce548 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,1406 +2,1426 @@ https://www.abcdesktop.io/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/adopters/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applicationsformat/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/architecture/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/buildapplications.wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/buildapplicationsgnulinux/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/changelog/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/faq/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/guiappsoddocker/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/overview/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/rdgp/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/requirements/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/runapplications.wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/features/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authentification-rules/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authentification/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authexplicit-activedirectory/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authexplicit-ldap/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authexplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authexternal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/authimplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/balloon/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/controllers/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/editconfig/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/frontjs/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/host_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/jira/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/language/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/linux_syslog_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/logging/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/stack/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/syslog/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/webrtc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/config/controllers/manager/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/k8smacosinstallation/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/k8swindows10installation/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/kubernetes_secure_etcd/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/novnc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/retrieve_all_images/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/uninstalldockermode/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/1.0/setup/vnc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/features/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authentification-rules/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authexplicit-activedirectory/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authexplicit-ldap/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authexplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authexternal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authimplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/authmetaexplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/balloon/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/controllers/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/desktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/editconfig/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/frontjs/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/host_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/jira/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/language/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/linux_syslog_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/logging/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/stack/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/syslog/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/webrtc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/2.0/config/controllers/manager/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/features/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/application/applicationruntime_ephemeralcontainer_pod/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/application/createsampleapplication/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authentification-rules/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authentification/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authexplicit-activedirectory/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authexplicit-ldap/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authexplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authexternal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authimplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/authmetaexplicit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/balloon/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/cloudprovider.loadbalancing/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/controllers/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/desktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/desktop.pod/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/editconfig/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/frontjs/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/host_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/jira/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/language/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/linux_syslog_config/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/logging/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/networkpolicy/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/stack/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/sudo-kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/syslog/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/volumes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/webrtc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/config/controllers/manager/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/k8slinuxinstallation/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/kubernetes_abcdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/kubernetes_abcdesktop_applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/kubernetesmode/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/requirements/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/troubleshooting_core_services/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.0/setup/uninstall_kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/config/persistentvolumes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/setup/k8slinuxinstallation/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/setup/kubernetes_abcdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/setup/kubernetes_abcdesktop_applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/setup/troubleshooting_core_services/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.1/setup/uninstall_kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/config/persistentvolumes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/config/webrtc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/k8slinuxinstallation/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/kubernetes_abcdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/kubernetes_abcdesktop_applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/kubernetes_abcdesktop_windows/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/uninstall_kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.2/setup/uninstall_kubernetes_windows/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/config/networkpolicy/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/setup/kubernetes_abcdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/setup/kubernetes_abcdesktop_applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/setup/kubernetes_abcdesktop_windows/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/setup/uninstall_kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.3/setup/uninstall_kubernetes_windows/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.4/setup/kubernetes_abcdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.4/setup/kubernetes_abcdesktop_applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.4/setup/kubernetes_abcdesktop_windows/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.4/setup/uninstall_kubernetes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/3.4/setup/uninstall_kubernetes_windows/ - 2025-01-08 + 2025-01-10 + + + https://www.abcdesktop.io/3.5/setup/kubernetes_abcdesktop/ + 2025-01-10 + + + https://www.abcdesktop.io/3.5/setup/kubernetes_abcdesktop_applications/ + 2025-01-10 + + + https://www.abcdesktop.io/3.5/setup/kubernetes_abcdesktop_windows/ + 2025-01-10 + + + https://www.abcdesktop.io/3.5/setup/uninstall_kubernetes/ + 2025-01-10 + + + https://www.abcdesktop.io/3.5/setup/uninstall_kubernetes_windows/ + 2025-01-10 https://www.abcdesktop.io/about/authors/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/gnu-gpl-v2.0/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/howreadthisdoc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/howtodolabsexercices/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/opensource/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/otherrelatedprojects/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/play_sound_in_docker/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/about/version/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/api/backend/launchdesktop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/2048-alpine-error/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/2048-alpine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/2048-ubuntu/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/2048/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/apachedirectorystudio/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/astromenace/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/atom/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/base/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/beekeeperstudio/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/blender/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/bless/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/blobby/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/boxes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/brackets/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/calc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/calculator/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/chess/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/chrome/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/chromium/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/citrix/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cloudfoundry/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cmd.exe/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cntlm/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/corsix-th/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cuda/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cudademo/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/cudadev/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/dia/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/doom/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/draw/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/drawio/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/dummy/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/eclipse/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/eclipse_sts4/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/edge/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/elementary.terminal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/eog/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/evince/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/evolution/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/file-roller/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/filelight/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/filezilla/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/firefox-esr/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/firefox/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/firefoxrest/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/flare/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/frozen-bubble/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gcompris/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/geany/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gedit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gelemental/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/geogebra/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gephi/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gimagereader/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gimp/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gnumeric/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/golly/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/gretl/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/hyper/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/impress/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/inkscape/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/jupyter/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/jupyternvidia/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/kalzium/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/kdiamond/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/kgeography/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/kigo/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/klickety/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/klotski/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/konsole/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/ksquares/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/kturtle/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/leocad/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/librecad/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/list/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/mahjongg/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/maps/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/math/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/mathwar/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/minecraft/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/mines/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/nautilus/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/netbeans/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/notepad-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/notepadqq/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/octave/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/onlyoffice/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/openshift/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/pinta/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/planner/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/postman/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/powershell/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/putty-unix/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/putty-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/qelectrotech/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/remarkable/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/remmina/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/remotedesktopmanager/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/rhythmbox/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/robots/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/shotcut/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/stellarium/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/step/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/stress/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/sublime-text/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/sudoku/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/supertux2/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/swell-foop/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/taquin/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/teams/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/terminal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/terminalai/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/terminalephemeral/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/terminalpod/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/tetravex/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/thunderbird/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vice/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vlc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vmmacos/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vmrc/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vmubuntu/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/vscode/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/weather/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/whatsdesk/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/winefile-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/winemine-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/winhelp-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/winscp-wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/wireshark/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/writer/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xclock/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xedit/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xeyes/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xman/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xpad/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/xterm/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/youtube/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.3.17/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.3.18/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.edge.gtk/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.edge/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.gtk/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.libreoffice/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal.3.17/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal.3.18/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal.3.19/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal.3.20/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal.edge/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.minimal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.alpine.wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.debian.gtk/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.debian/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.debian.minimal/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.8/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.9/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.gtk.8/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.gtk.9/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.gtk.libreoffice.9/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.minimal.8/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.minimal.9/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.nvidia.8/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.rockylinux.nvidia.9/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.18.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.20.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.22.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.24.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.24.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.java/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.gtk/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.minimal.24.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.wine/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/cheatsheets/bash/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/cheatsheets/docker/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/cheatsheets/macos/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/acl/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/custom-wallpaper/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/debug_application/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/disable-firefox-connections/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/exec_command_as_root_inside_container_without_docker/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/firefox-extension/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/flash-firefox-esr/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/non-free-applications/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/shm/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/upload_and_download_files/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/1.0/abcdesktop.bastion/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/1.0/docker_macvlan/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/1.0/update_frontend_image/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/3.0/createcontainerisedapplicationdebug/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/3.0/mount_nfs_tag/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/3.0/multiplegroupsfeature/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/3.0/update_frontend_image/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/common/3.3/update_frontend_image/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/memcached/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/mongodb/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/nginx/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/ocuser/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/pyos/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/core/speedtest/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/services/file-service/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/services/spawner-service/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/setup/kubernetes_flexvolume/ - 2025-01-08 + 2025-01-10 https://www.abcdesktop.io/setup/kubernetes_networkpolicies/ - 2025-01-08 + 2025-01-10 \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index b4f62c555ce2f0169912c420d5c94b6befed8b0b..5cecbebf97abd7a5b2ab67de85a47102e2a46048 100644 GIT binary patch literal 2501 zcmV;$2|D&4iwFn+V}NG@|8r?{Wo=<_E_iKh0M(t#a^t!YhWFdfdGt)F7xzhO0-9woTQRU75^SDY*|wA{|Gc1-2e!D`Qtp2%s8lW9^RZG0TI zNss(b+AeQyA2z>#{`T7^{+Taudv*Q!V!i%0UnMPD5MuL+??g?l10@CdB1#mzSIK*+v0ujsvErm{5>tQW~|K#YcT{+IYBj6U9mzNlT zedIEDLEZl7Q*NR6|6-y7Nm~v$iy8c}NUNpZYH z_wTQa^cFYW&ElaD;JHpCVw{>e~9!hv<){ zr?|0R^~|H3UO575;7MQuO#=T_eFNy`p=oFXO+y=a8rtB}&<2}^He%Ay2AYQ6sXNLi z9}mHE&x8t?R!@cRwM*}-AMS)L z<12ztT4W;rGuPTPz0KX+H)cKa4+3sDrL&Yq?=$yb+=)hN)4Y;g6A0;j9==6+^xd0h z3G?GYDRcEe-0Mz^U)jm=D?6cnWhbvi?ZmXGT1bnkkpW9Bra9MgnsY6*Isa#_Wf>s` zNkVh}_avCIX#}Lgjht512yIo3yjInSX;qE5R`n>yq927?^rJkBeiUQTkK!!)NsdK7 z3AN}ac^3U7#-g8uS+weW$=A7Q9|6LHE7cHeb(~jct*$=$QzX^r(WKsMh<^6Hx2j8Y zrl{A>@NX18kW0QqO#tmYQjEkoEX~UTUPxy^2?VPyEf<07TjSdGx8Ar>EPDy9yPuBP zc8YJ;^?b$R^a$w5P(9TL-TLA2xl%S5M-^M7j}l0*45ceB7bpWvTm_}aA8QCxF8#{8 zYkiP9@x(cSHxGdEgmq1)XI#O%bV|5>VZD-32G_&jh^rICs(+ z2cVVJQ1QYcBCu2D&H!lpdYs)qR^Akx``0E%bH>Tfi zo^zvfl}8*w=@nGGr^$l>jxhb+;0nL@z{t0c>I4-B2E2WlCY-}1ZA}2C9gBXOa(cu; z^aHR2>~&?MikD5MIGL3nAN$C%?!xSk+DGGnnLo`dt@7$4lXnDrW2w5W(1tQtGmIHZ z@ZDIefCQ2D{#;RtXa=-?qy)4Ct0K-H?4$oquIftHSscZn{S>0XCFKJtcLA#RCIi)% zuGs<+{6Jk)K!7kBoceXA!+G`^*e5asZl-W>Wuj`tE3u12YF@zaxjG4}9~JcRdbZ?gXO>BhC#S%zzspI`GQ_ zW#HXgpVI*s1swR72L|DX^jcH|PK+LMi5XY`mb_Lt2VhMX2@3#BgC{kq7|bHU*GlF9+~PZZNg7B?CaO3s(6IN%zk8v@iB zzLF)KBfCV63rr$SDjpPaW`YssxoV_7*TM2BU_YymFykeUQwN-|i@x)~m9uH|Sr=UA zlrnop6_Mj)j1Yk0(4pc~I%_7XGM#}oP0v1mvfCHIB_GW_8$0PTUM{d;G(2V zYDz$L@baxU0A=6^??)`aNmkzS`6q@PIdR2>1$iv<(^Q>_xI#E0^X4P)iJs$hJ<$`W zACWf?ezNwM^vXMyevm(rnxFc|>5nR>`9mB5r|H)4A$N}7Q08U`f#}eU2MlQbO(g8Phc>jn$@p_YK z3iDn(o7?^)n`X27i)6TGv2gQ)Q=1_lHrFK@;3=~I7FIN%SUAZA_X}8`*s|l;*i6dG zc7k`1&%XlX@4oL%_-k#DDUX%-@z>>U8)^K>ed3Y2{S3iiRt3}g2 zN~W9rwrty*31!>gm9Q31DBccV)KQ5Bd^=9M3Q8X;Wvy&l$%Au0IK{HPgXB4VBh4FvcPfo2?ez~zxmRC( z1)=uScpXiBaIV4wFK)Gn<<+r_gC)v&%6i~Q3AWo!(I2f;Z6+XPiBx?yKK2XIa-B+ zD52-jqTNS!8#JFoHgE3-U}=~|NA6|m-GP}z{auT>b^{=?$#dk@x_xT1f-w}EO|UdX zUqae*QI&|QDLGctNMPZ5m}t`1qr28u_HOWfx4Nzyj61Kc>Ny}?JD6eFa9KO%XVDah z`n>Xn&s@64>v^Ep2St|uAOI<-6L$j`hMx`+-dj4)+tE*04E}xc@en+Bist``pss)T P^56amEL~TaPrLvCqhIC* literal 2477 zcmV;e2~zeSiwFn+z zX7})gjI_Nn!}o`O{QZyW>EZY1-@YZU1H~`=WfQ(Xj4`^uZMWz1c@tEmNw~1Fe%J;% z@;_lazq#FQzCJwv_Jx1)0q(DEKi{;K&-o}}K8)yOPvID?+bFyJw#}a}zb-c3RGeYJbyugve=kH38v`2VCtZ(ZcmUscmNt)z%tM5i3*AkF&%rAfgiohw35gLe~CTJ;iLTd|aA^azLtM$rx=7NA*WSn1O01lqZ z;01O1qYbfzp8t#T0wk?D;Y?y6lzh&x+i(q>^J1?70}SkILFyq2c|>X7N*^SCrp`xM zK;b!31CJ7Xi+a907B%}?>a7EA>lCZs#aOU3IbJ*_+ph+F)CKM^Ofh4E)Ek)U5 zSd2XxiIMgcy`mGfd^K7%aXk$fkYwgMarf?gXu^Q3d?{*>xvWbvmvwort}evY)p%D| z<6T{icXhuYOcVw9VgSr#4L6qyg85yLI>y@8P-|Pmt!<67wl&t;*2P%c8ftB8ptY@$ z*0x4k+qxKQ+kg`0th<FLW*1(9J__XalvO4cvw{I2+nvZD>=B4Q-${bfIo2o~=JR%RLh+ zVOre^FSS!|tDo~}D2mk$`9l0;b(&zOzW#7PQ`B(4`~31PBBAD%n}0XA{PQaXp|nUN z{wvqoGri4X?i;h7`6mH4oYZLwqqULyFYZJ=wIQ!0mjpt3pNDTz5qFg$MS0QV=*=Qv9KB~I-BBcCeM0+ z@L*CkI9;9cT9(z-M|<`p`Z%i4TM5yRwzpbzfiC3b+J5LxVI7%Zla~b0jw5+bobgkh zM13I{0VUwHxVBsbrf-#L*Wak%PBHJivhMC9YTF4uUDNXslaV8!CqwmAA9U;8<5MNH zQ-&(8k=B<$f@MfuGBH6JVB*3FIsRO66=LdF-izo1O^Du3WQ4?32@&lC6YoU8oq0!e zB+A2d*jmtO4%6h3`XK<-ZP#6K^7cZ&llQrkjyM1*w1kQ$P7#5fGIs{Rx-Z8Z{;~2Z z;ljUE(W?tiJ}>b+WP9Lo0Z2~$hD{<)-$V_p0hYbdrHUhtAoT(&-qU2k04JD!uW*Im zTVUqfdvS(}0~6jpO%pEQlGMrpZO5$Nh8P}k5d8ow0exEsCj501$xmwKn{7U_thC-HJq2J*(8A;5 z!NJ=fWU4N8oyJiN(oW7RoGBkjm@81dR}rW_cg-4zUK!#a$x2t z^bh2)^pQ_~vZluYWo|`IYYd@!U(L4;)E*zYxLC~4hlFuaa+DVDqtvZ%0!$Ca#|Pz z^n%XvA%y|zpUH=jG;TD+r5LYOGQc%TcLZoKd?igXdJc&amza2(gg*-8%mgFkxoV_7 zUxWEm!0taEVa975rw%w_=WSp+m(Xby`hSMY;g% zK?~x}DzO(iev%f%BR9@%`oKCtR z2XHSAIDwrX;({9)x!M#{2i(-*{UiRw%1xxn<-K?|_x(pU&1V1ClHs0;h08ZiZH9Q< z+?Hs7r^xK0)m(w(K}JR+G?W2f+p8(`SJE`UxQGUGb1b2gDh&SiWdMbqUx`l)!r^2>0M4Hi!O*3UhC3d*v} z@_v_A;YB$^7Fd$^$r?_tH@nAT>FQn4bal~mk0sOPxLtPL%YsaG$4Y2jHf_m+b3ZwYWqV7%$_|fjlx2s=cgp%xP!=63=Ulez3;qUK^z|-t zq;3JXnZo^{J!?|Rkwgq5W_|@Y3M?-&98;&TM=4sZETeZs;4$Tf?aTg z@aA9Ds_W-5>^@|pB>jpq%ljY2-HHXkf0b@uyDyM1iHo0)%qDmfhrOK%_O$jV~9VVLO z?a^K9D_b+zzFS?_49Z+qSGAmwuAR)Vth=tA^RsAhM15R&!)Gqt)9rbnw;M&~{~!Rt ri8FTt7=~XSBz(|x$=lISSd8T()zzQLpl*No@X!AQj*61ReYpSt?d0Gk