From 07dd503666c6680776881f45df80d44ac0155009 Mon Sep 17 00:00:00 2001 From: Sergey Kalinin Date: Thu, 5 Jul 2018 08:34:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D1=85=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README | 1 + lib/function.tcl | 283 +++++++++++++++++++++++++++++++++++++++++++++++ lib/images.tcl | 138 +++++++++++++++++++++++ 3 files changed, 422 insertions(+) diff --git a/README b/README index 5b42f9e..b76a25f 100644 --- a/README +++ b/README @@ -11,3 +11,4 @@ Иконки взяты с сайта https://www.iconsdb.com/royal-blue-icons/ + diff --git a/lib/function.tcl b/lib/function.tcl index 45c4fd2..60148ab 100644 --- a/lib/function.tcl +++ b/lib/function.tcl @@ -1279,6 +1279,287 @@ proc Add::profile {tree host values} { } return $frm } +proc Add::directory {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "Виртуальный каталог" directory_grey_64] + + label $frm.lbl_alias -text "Логический URL" + entry $frm.ent_alias + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_physicalPath -justify left -anchor nw -text "Физический URL" + entry $frm.ent_physicalPath + label $frm.lbl_allowedRead -justify left -anchor nw -text "Разрешено чтение данных" + checkbutton $frm.check_allowedRead -variable allowedRead -onvalue yes -offvalue no + label $frm.lbl_allowedWrite -justify left -anchor nw -text "Разрешена запись данных" + checkbutton $frm.check_allowedWrite -variable allowedWrite -onvalue yes -offvalue no + + grid $frm.lbl_alias -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_alias -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_physicalPath -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_physicalPath -row 2 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_allowedRead -row 3 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.check_allowedRead -row 3 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_allowedWrite -row 4 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.check_allowedWrite -row 4 -column 1 -sticky nw -padx 5 -pady 5 + + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl directory update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --alias=[.add.frm.ent_alias get] \ + --descr=[.add.frm.ent_descr get] \ + --physicalPath=[.add.frm.ent_descr get] \ + --allowedRead=$allowedRead \ + --allowedWrite=$allowedWrite \ + $host" + Run::directory $tree $host $profile_name + destroy .add + } + return $frm +} + +proc Add::addin {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "Компонента" addin_grey_64] + + label $frm.lbl_name -text "Имя" + entry $frm.ent_name + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_hash -justify left -anchor nw -text "Контрольная сумма" + entry $frm.ent_hash + + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_hash -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_hash -row 2 -column 1 -sticky nw -padx 5 -pady 5 + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl addin update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --name=[.add.frm.ent_name get] \ + --descr=[.add.frm.ent_descr get] \ + --hash=[.add.frm.ent_hash get] \ + $host" + Run::addin $tree $host $profile_name + destroy .add + } + return $frm +} +proc Add::module {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "Внешний отчёт или обработка" module_grey_64] + + label $frm.lbl_name -text "Имя" + entry $frm.ent_name + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_hash -justify left -anchor nw -text "Контрольная сумма" + entry $frm.ent_hash + + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_hash -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_hash -row 2 -column 1 -sticky nw -padx 5 -pady 5 + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl module update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --name=[.add.frm.ent_name get] \ + --descr=[.add.frm.ent_descr get] \ + --hash=[.add.frm.ent_hash get] \ + $host" + Run::module $tree $host $profile_name + destroy .add + } + return $frm +} +proc Add::com {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "COM-класс" com_grey_64] + + label $frm.lbl_name -text "Имя" + entry $frm.ent_name + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_fileName -justify left -anchor nw -text "Файл (моникер)" + entry $frm.ent_fileName + label $frm.lbl_id -justify left -anchor nw -text "Идентификатор COM-класса" + entry $frm.ent_id + label $frm.lbl_host -justify left -anchor nw -text "Компьютер COM-объекта" + entry $frm.ent_host + + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_fileName -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_fileName -row 2 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_id -row 3 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_id -row 3 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_host -row 4 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_host -row 4 -column 1 -sticky nw -padx 5 -pady 5 + + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl com update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --name=[.add.frm.ent_name get] \ + --descr=[.add.frm.ent_descr get] \ + --fileName=[.add.frm.ent_fileName get] \ + --id=[.add.frm.ent_id get] \ + --host=[.add.frm.ent_host get] \ + $host" + Run::com $tree $host $profile_name + destroy .add + } + return $frm +} +proc Add::app {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "Разрешённое приложения" app_grey_64] + + label $frm.lbl_name -text "Имя приложения" + entry $frm.ent_name + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_wild -justify left -anchor nw -text "Шаблон строки запуска" + entry $frm.ent_wild + + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_wild -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_wild -row 2 -column 1 -sticky nw -padx 5 -pady 5 + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl app update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --name=[.add.frm.ent_name get] \ + --descr=[.add.frm.ent_descr get] \ + --wild=[.add.frm.ent_wild get] \ + $host" + Run::app $tree $host $profile_name + destroy .add + } + return $frm +} +proc Add::inet {tree host values} { + global default active_cluster profile_name agent_user agent_pwd cluster_user cluster_pwd auth + global + if {$cluster_user ne "" && $cluster_pwd ne ""} { + set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" + } else { + set auth "" + } + set var_list {allowedRead allowedWrite} + foreach v $var_list {set $v "no"; puts $v} + unset var_list + + set frm [AddToplevel "Ресурс интернет" link_grey_64] + + label $frm.lbl_name -text "Имя ресурса" + entry $frm.ent_name + label $frm.lbl_descr -text "Описание" + entry $frm.ent_descr + label $frm.lbl_protocol -justify left -anchor nw -text "Протокол" + entry $frm.ent_protocol + label $frm.lbl_url -justify left -anchor nw -text "Адрес (URL)" + entry $frm.url + label $frm.lbl_port -justify left -anchor nw -text "Порт" + entry $frm.ent_port + $frm.ent_port insert end 0 + + grid $frm.lbl_name -row 0 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_name -row 0 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_descr -row 1 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_descr -row 1 -column 1 -sticky nsew -padx 5 -pady 5 + grid $frm.lbl_protocol -row 2 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_protocol -row 2 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_url -row 3 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_url -row 3 -column 1 -sticky nw -padx 5 -pady 5 + grid $frm.lbl_port -row 4 -column 0 -sticky nw -padx 5 -pady 5 + grid $frm.ent_port -row 4 -column 1 -sticky nw -padx 5 -pady 5 + + + .add.frm_btn.btn_ok configure -command { + RunCommand "profile acl inet update \ + --cluster=$active_cluster $auth \ + --name=$profile_name \ + --name=[.add.frm.ent_name get] \ + --descr=[.add.frm.ent_descr get] \ + --protocol=[.add.frm.ent_protocol get] \ + --url=[.add.frm.ent_url get] \ + --port=[.add.frm.ent_port get] \ + $host" + Run::inet $tree $host $profile_name + destroy .add + } + return $frm +} proc Edit {} { global active_cluster host @@ -1943,3 +2224,5 @@ proc Del::inet {tree host profile_name} { Del::acl $host inet [GetWorkTreeItems "name"] $profile_name } + + diff --git a/lib/images.tcl b/lib/images.tcl index 68924d7..3da3f07 100644 --- a/lib/images.tcl +++ b/lib/images.tcl @@ -483,3 +483,141 @@ image create photo security_grey_64 -data { Qfqtz0oFeuVoeTXtvWETYnlvaOSGRtHi6tZ8Rp/qzHCDtKiXzfLy2rTRTWdxg84xclzgRxm2Qayy 31kmTjOtrOVNVrAUyPOYB9xkhDGZt0X7D6zc881zDmwYAAAAAElFTkSuQmCC } +image create photo directory_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfiBwUEHwo4IHNXAAAC7UlEQVRo3u2YTUhUURTHf955DiIiLkRE + JFy0CJGoYFpEuLQY2iSRH+FHuOmuW0a0bOEqWlwoSETJshCSqYWJRolJvF0FliISJC0GEROZ7PFo + 0fjmzdebHN59r8Wc1XlfnN+959z/O/dCxSpWsZCtKuPKRtqpI0oUgYFAYGNjYWORYo91taUNQHZw + lziixNtL3FZv/AWIAMh+ErS7Z6OIHWMwVm0u+gwg4zyj+p9nrDP223znYwpkPV9oPtI3FqfVJ78A + BMNHDA8GN/2bAUFPGV9dlMIvAIP6Mr5q5oRMcoCFje3ctV1vOL6ySgGUZ5+zQh1i2K46OVSXbzzk + gdovXoQf6dAud5v0qZViNRCEtfFang8TAOqYkvVhAkArNwoDBIdwLWyAdlnj3zIsT3NeyH1SpNjn + Owt/10WQANDlvpAzjKgdQXjWzUtphAkA5xgOFwB6StdAkkessYeN5dZ4rCMUX2a9GUCUBu6lV1+b + UaIMXzGkkn4PW3Y6i3/XKNGEXlYHGiZ+wPGWvWvglo7wspYrzsWUF8AqS1oK7xINaW+DFS+AMWVr + ARhyvMfKFh6976SO6LLFpYfjXj+jeR0bMaDXWXfLat0LYEyT9GQSMOHVkGwzqyUBZziZdlNMewFM + q5Tm8c+qbS+AcS3jj9KbG6EwwFc+aBl/nKa0t8WcF8BEAApgFQewNSlAE/H8FBcCeKs2tYy/n2ja + MzPbexFUAWYlYNzdluc2FnvMaFKAU44CPPHaGSXUrubxJ9wtjghIAWpcCjCWvTPKTsEPFjT1AHkK + UBjguZYWDEYcbzL7zESQHXBCSwLiTg9g5/5lBe6edwNTQ/irPHVqbUmt5vbsi64OZZsueZA+8bEc + Zm9ZznQUGc8ADARRWunDfTYymn9G1MIatQHtgybVQO6tiPkzluJCIOHn6Dfz9lMRMN/HGjmrObjN + fa6rX/kPDo/rBxl1Vqr/Ns8dtVz4UZVLq7o5riH4Dgm1QcUqVrH/1/4AqpXJGRqvP3oAAAAASUVO + RK5CYII= +} +image create photo addin_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfiBwUEJQdjONGTAAADtUlEQVRo3uWYXWgURxzAfze3HEGChEJt + K+pTEUGQ0LiW+IWaC0eQQoUiFIrUx2kIpVYQH0peBFHBB9EMPohvIvRDihqrldYH+wFZilxF2lIk + FBsOEUzDIUdcNj7kPG93b+9mZza5hw7ccbu3//n9bj7+Mzc5jIo8xHv0UUDgACAQjS8DghYhfuPd + x2eeKo+4qO7mjPAreEoB++IzkjeJ8567zyhlICB4M28W6f3iOuzMQCGXN430fnR72Wot8F/ePNb7 + 3n2Ndy0FZvM20e4tXsftooC34H5nqWAnkIGCrUBd4Q02d00AvAX3Bm8x0DUB8BbcSQZYbyLgxNJs + L9vpZy0FCghEI9s3J9CAn9RE6F6RPWbyocrlBo7wAb0do8p8GoorcoUVlgKywDiHtZaY+wyrJyH8 + t6b4hoBcydcUtSLuM6QeZ4WvC8gCVzT7MIrfZYenvo04boy/aoeHHMh+pmIjXRffazmDpx1gPIaf + 5yE+Pj5B/eUzy2jmeCAnV/FvRGCSMfWww6ZsJ9ezwDPtUIzgv+JD5S8THhCRlazKaEf89mwa/6VA + X+j6TnM/t8Rv5TorITuBntB1rQP+nWzxINLs7+UGbkRaLAMBRxvfx1VWQdcEOMrbNrs/e4H3LfAP + 2MhEawGh2QE9rLPAD6kZxlopCO1KnBRtFcdXQAWtFPS7oNZpiiaUPxhWlcWPrRS0W0D5/GaEH1Iz + TbXEFESKys7b4hsKZ40E1CUu2+IXFdQYp01aAA5y2xZfl/icYwYCqsY+7mqO/N3NeBk7zFBfMIrP + TLoWQFXZy69am7dKE/4jzrWoa4IBDoq040rNUeqgUI7hL7ae7Kqs/hLpZ5aaY6SNwr3I1vVAEt5k + EL5UmKWUMBa8yL+mA1xon+qMBOqtcC12+4e0eGMBUFX2cYRXuAqfUVKz6fAYLzCLyfmkPMNm1hAw + zT01H1o99+vgrQTqmSEpL5T06hYsVRG6jwX/ewF/iQTCIyBY/hZAV8Bfli6Y77ZALfmx2rJMy2fJ + AtXQ9RbZkwVPOmwK3agkC/weul7D4Ux+8SeRg9s/kydLdJc3LqucVRYjQwo+5lRsnUw6IwI5FTts + LzNpMT2LbIltUDeqIDldnODLyN1NkR60LcdV0G6yfJPcQJmUn7mU/GUOQK5mitVLhH/MYLtDPwGg + ZhhOnihW5Ql725851hOPesCgxn4/bfEYVJ5mwlTT7EDyT2bwR4yyTf3d6bFcLIPtYoR++ujBwUmV + mhdPl2vMUeYmt/VyyQtF7jBPKF0n5wAAAABJRU5ErkJggg== +} +image create photo link_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfiBwUEJAmdm83VAAAD70lEQVRo3sXZT2hURxzA8e9O1hxCtFIW + D7YHD7IEqTGmpiyhNkSl1g1Cqo1Roiw9Dj0VWii9BLGlBwseKs7RvylahUqt1UZBbJolSBrSkEJY + RDxJkXSRsCyyyNLD2yRvd9/bNzPvuXnH+bOfH7NvZ36/2RjWj+wmzQ4SlHjKJL+oFw1HCwYZopM2 + FslyXs067TFLPMUZUlVNBc5yShV9xncwRrerocwlPlNFywDkV3yL8OhY4KB67DF+F/fYWNecZb8q + CAv+NN/hPa+DhzKpyUMvP1isgDzNFw0HPKNf5TR454t4tyViHtZzuOfX6f80eIhREhHzAJt4R4sH + 6G2JnH/FiLoBIHsZ542A0forYMD/VOHvsCFw/EuxpjzMxSLky4yoq0Y8DMUi5D9Vlwz5OXbGI+DH + ucwCL9W8Ib/EiCrHQ/IlMs6yV8ab8AfUfMBOqMF/rH6z5rMBp2Ez+AYBNIf3DaBZvE8AzeM9AzDm + O5mw5T0CMObj/M02W57azMaUB46a8vKQO2sSIXkYNuSPcI0HqyGIkDx0avAFFz9GnM2rIYiQPBqv + X4GBKh5gMw/kVlcA1jwsavB/1PBOCLdkWyUA+bU1D1NWvJPEj0IM5Ps8RFjyyH3c0+CT/EP9yVvk + LQGcsedB3eduEA+043XwtzEo5HvssucByJAL4KHDZ26f4GBIHvWc3YzXNOboc/Ew4jN5S5yucHwl + hP3yQzKkSFBgluv8qEqu9+QIaZ+prXES/ktbs+cfZZhONrDIFBfV/ZogxutWYXlmmsu+Rj5OyS/V + rMr1uhhb2fM3spXj8i4n1GLw6sg0P9PqnxcLnvh0uaKWHzBRd+R8xKRMhOThlmDCp2vBlW7cpt1j + RJKLIflpNSW4SdGzyFpyZTvtPh+QlntC8GU+B6HynPOs8XJayVbGmodR9adzFpys2UhMSsyUNf+9 + +qZyGqoCAzyzrHA3WfNfuvIB9Zj+SgimBfZSOH4lH1A5+vnXpr4Px7syIpVjL8OGPFwLx3vXBfr8 + AtvVqzA89ZmAAV/gWFi+vi4w4QeWL5zt+dq6wKTGc6cb1nzVO2BfYtrzrgBkit+bz68EoHGp+lr4 + 5brAnv8kHO/UBduYNOVlknaSnPDN9TR5iEnBXw0SU78Kd4y4xoxAHgSDa8mDYGgteRBa9f1r40HQ + tpY8CPL6dzvR8yDIav/u53keNQ+C87rbjsqtJG6R8SDUDFd07/UCQzDmna1Y8sij54XXtaLK0ed5 + GwBlRs15aIHpUs9V3mZHVfssA2rGs5rK91yglS7WVTXPcMz5w8b0WT2Ou8nQS4Iic1znpio3rPre + 5BC72UIreWa5rbJYPv8DNtgDQ5xHGC4AAAAASUVORK5CYII= +} +image create photo module_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfiBwUEMjtJ1CmCAAAEhUlEQVRo3sWZXWgcVRTHf9mu61pCiFFC + jIsUCUEQSi1trFEi0SoxX20akNWKUD8eLqm+tVJtKFJbUKIvRo5gS42rEtE0qdC0DbWVkJZSFymx + aCmahyAxhBiClrqEdfGhk8ns7szsfMb7ds/e2d9/zj333LNnyzAZqp1e3pZRg6WOo5yRwwbLJ9Sy + Uxb1eYQBytkpN3E1IqZWRQM9eZbtNLHPsCDBK7TSZFhRxwtsZxMEISBS9EkEiBrm0aKnIzbf51rA + Ko4yzaX1vMp6Ypp1PVUsMGlYdx/3k2Ncn8fZAlxlXrespQG4wnJUZLnOgFx2JEC9hOjwIEeOw9Jr + v2QNqEaG8/Y3SP82bf4tPWm3JArs0yJhUXdfDXEyzBrWVVJJjmnDcwlgjpVDF6MWmCWjb0k1AG/x + eYktUH9SBUzysGgPq1O0cFqeMRy7vbxLRu7Q5zX8AXTJiG55gF+AZvlezwsnaAfgzpVsYX4K1gLw + 8zLeZkdLW/QhOX7QA7bEFhSPITbxdZ7lLDOcNsznOUeCtMEyxUUqmHQbJqYC5AhHCiw/cm/ePMuT + BSuWeNRLnP7viSh8ATmy7mMgSPwumQdQrRyijlFelhur54Ecu+QzAJXkBBso51lOqvLVEmDEp3Rf + N+VLCFNAvwm+SIJlDKgkNa5wc/JlwcFc1GqpVBGliZOq7VYslIH6hzgwKM8Z8I1ccP3Gj8u46avs + 5kMT8zhtcsPaA1f5VrtMHHugOAuqJMig9CtMJGhesBAgf7HNbwioJClQdhK+YFtoQaiFXpSUSoL0 + 85rJos7QToFKkiJLBmwlLIYkQCVJMcODPKWdNCsJB0MRoOGbZYoO/bCbSeiTD0IQsIJXB9lruHMK + JfTJHptEpGIcoNblMTwgmTz8/oJrL2U4ERreOg9s4U3XL39GVVvi8yVckYlSqfgS73C3K/wCCY7a + 4I0SJkrWA7JEr4+9329TfzzEYAjXsUM89MkbIZRkLvB7QqgJ/eADEOAP71uAX7xPAf7x1pmwkiEH + mbDOL946EdXzhAMXTPvFWyeiy6rNtiTrpj0IvE1VbOwSmux9SzB4T0HoLvRUREUDFaCSpFhwjueY + /aUW8YCPMsPv6pBD/IseY8AUn2CAKLCBv23beo7xbj2wQ8fGHITe7tJ4twK67RtTBZFfGXCHRFXz + GIt0kPF38Lx7oJMIozJqI8E13p2ALmAI5KyFBA94FwJUBVu5yRhYSPCEd+OBVmKMLTeYiiR4xLsR + 0A00qHr9rjBK8Ix3nIhUnBaglvOqWa6D2kgXO7Qu8HuFlW4IAniaW22lWs6rb+hknVYPjPCVXPRT + VUVdnAA0Ca8D1zjOsKT919SOBKgonfokzTDH5VpQv6adeWAdVeSYYIgRmQ7257wjAfKreoQpmQuj + mxIFloiDfVNOLnn47uV/GGy75WWgLtAIwDnM3/E7PpWsirOVDioc48tpJQLMyj2lPPCRJsCqEE/y + vpolof235HaI/cdrIP3T5gQbbVfdzl3c5gk/Rk/63xJbAKCep8dlT8hJz+QYH0vWftF/J66z4CBq + V6wAAAAASUVORK5CYII= +} +image create photo com_grey_64 -data { + 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 + 9vdkdPkXjRXeVY2+qF0AAAAASUVORK5CYII= +} +image create photo app_grey_64 -data { + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA + CxMAAAsTAQCanBgAAAAHdElNRQfiBwUEJQdjONGTAAADtUlEQVRo3uWYXWgURxzAfze3HEGChEJt + K+pTEUGQ0LiW+IWaC0eQQoUiFIrUx2kIpVYQH0peBFHBB9EMPohvIvRDihqrldYH+wFZilxF2lIk + FBsOEUzDIUdcNj7kPG93b+9mZza5hw7ccbu3//n9bj7+Mzc5jIo8xHv0UUDgACAQjS8DghYhfuPd + x2eeKo+4qO7mjPAreEoB++IzkjeJ8567zyhlICB4M28W6f3iOuzMQCGXN430fnR72Wot8F/ePNb7 + 3n2Ndy0FZvM20e4tXsftooC34H5nqWAnkIGCrUBd4Q02d00AvAX3Bm8x0DUB8BbcSQZYbyLgxNJs + L9vpZy0FCghEI9s3J9CAn9RE6F6RPWbyocrlBo7wAb0do8p8GoorcoUVlgKywDiHtZaY+wyrJyH8 + t6b4hoBcydcUtSLuM6QeZ4WvC8gCVzT7MIrfZYenvo04boy/aoeHHMh+pmIjXRffazmDpx1gPIaf + 5yE+Pj5B/eUzy2jmeCAnV/FvRGCSMfWww6ZsJ9ezwDPtUIzgv+JD5S8THhCRlazKaEf89mwa/6VA + X+j6TnM/t8Rv5TorITuBntB1rQP+nWzxINLs7+UGbkRaLAMBRxvfx1VWQdcEOMrbNrs/e4H3LfAP + 2MhEawGh2QE9rLPAD6kZxlopCO1KnBRtFcdXQAWtFPS7oNZpiiaUPxhWlcWPrRS0W0D5/GaEH1Iz + TbXEFESKys7b4hsKZ40E1CUu2+IXFdQYp01aAA5y2xZfl/icYwYCqsY+7mqO/N3NeBk7zFBfMIrP + TLoWQFXZy69am7dKE/4jzrWoa4IBDoq040rNUeqgUI7hL7ae7Kqs/hLpZ5aaY6SNwr3I1vVAEt5k + EL5UmKWUMBa8yL+mA1xon+qMBOqtcC12+4e0eGMBUFX2cYRXuAqfUVKz6fAYLzCLyfmkPMNm1hAw + zT01H1o99+vgrQTqmSEpL5T06hYsVRG6jwX/ewF/iQTCIyBY/hZAV8Bfli6Y77ZALfmx2rJMy2fJ + AtXQ9RbZkwVPOmwK3agkC/weul7D4Ux+8SeRg9s/kydLdJc3LqucVRYjQwo+5lRsnUw6IwI5FTts + LzNpMT2LbIltUDeqIDldnODLyN1NkR60LcdV0G6yfJPcQJmUn7mU/GUOQK5mitVLhH/MYLtDPwGg + ZhhOnihW5Ql725851hOPesCgxn4/bfEYVJ5mwlTT7EDyT2bwR4yyTf3d6bFcLIPtYoR++ujBwUmV + mhdPl2vMUeYmt/VyyQtF7jBPKF0n5wAAAABJRU5ErkJggg== +}